Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];

Вниз

SetupDiGetDeviceInterfaceDetail - ошибка 1784   Найти похожие ветки 

 
Artog   (2007-07-17 11:40) [0]

Здравствуйте. Хочу получить список всех COM портов с friendly name. Использую следующий код:


procedure EnumComPorts(List:TStrings);
const
 GUID_SERENUM_BUS_ENUMERATOR : TGuid = "{4D36E978-E325-11CE-BFC1-08002BE10318}";
var
 DevInfo          : HDEVINFO;
 devData         : SP_DEVICE_INTERFACE_DATA;
 devDetailData  : PSP_DEVICE_INTERFACE_DETAIL_DATA;
 A, Size          : DWORD;
 err                : integer;
 res               : boolean;
 s                  : string;
begin
 DevInfo :=  
 SetupDiGetClassDevs(@GUID_SERENUM_BUS_ENUMERATOR, nil, 0,
                              DIGCF_PRESENT OR  
                              DIGCF_DEVICEINTERFACE);
 if DevInfo=HDEVINFO(INVALID_HANDLE_VALUE) then Exit;
 try
   A:=0;
   devData.cbSize := Sizeof(SP_DEVICE_INTERFACE_DATA);
   while SetupDiEnumDeviceInterfaces(DevInfo,
                                     nil,
                                     @GUID_SERENUM_BUS_ENUMERATOR,
                                     A,
                                     devData) do begin
        Size := 0;
        res := SetupDiGetDeviceInterfaceDetail(DevInfo,
                                               @devData,
                                               nil,
                                               0,
                                               @Size,
                                               nil);
        GetMem(devDetailData, Size);
        devDetailData.cbSize :=
                         sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

        res := SetupDiGetDeviceInterfaceDetail(DevInfo,
                                               @devData,
                                               devDetailData,
                                               Size,
                                               nil,
                                               nil);
             err := GetLastError;
             S:= devDetailData.DevicePath;
        Inc(A);
      end;
 finally
   SetupDiDestroyDeviceInfoList(DevInfo);
 end;
end;


При этом в err возвращается ошибка 1784 - ERROR_INVALID_USER_BUFFER. Может кто подскажет в чем проблема? Спасибо.


 
Сергей М. ©   (2007-07-17 11:54) [1]


> в чем проблема?


Не исключено что в неверном передаваемом тобой значении devDetailData.cbSize


 
Artog   (2007-07-17 12:03) [2]

Выдержка из msdn: The caller must set DeviceInterfaceDetailData.cbSize to sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) before calling this function. The cbSize field always contains the size of the fixed part of the data structure, not a size reflecting the variable-length string at the end.
Вроде я так и делаю.


 
Dib@zol ©   (2007-07-17 12:12) [3]

МСДН тоже не всегда точен. Напр в справке по структуре OPENFILENAME пишется что в cb надо прописать размер структуры, фактически SIZEOF. Но в ВЦЛ однако действуют так:

var
 i : Word;
 OSV : OSVERSIONINFO;

...

 FillChar(OSV, SIZEOF(OSVERSIONINFO), 0);
 OSV.dwOSVersionInfoSize:=SIZEOF(OSVERSIONINFO);
 GetVersionEx(OSV);
 with OSV do begin
   if (dwMajorVersion>=5)and
      (dwPlatformId=VER_PLATFORM_WIN32_NT)or // Win 2000
     ((dwPlatformId=VER_PLATFORM_WIN32_WINDOWS)and
      (dwMajorVersion>=4)and
      (dwMinorVersion>=90)) then             // Win ME
     i:=SIZEOF(OPENFILENM)
   else
     i:=SIZEOF(OPENFILENM)-(SIZEOF(DWORD) shl 1)-SIZEOF(Pointer);
 end;

где i и есть нужный размер.
Тык вот, попробуй цикл, где с некоторого нижнего порога наращивается переменная и как только возвратится результат "операция выполнилась успешно", раздавался гррррооомкий звук и мессиджБокс приносил тебе на тарелочке результат :)


 
Сергей М. ©   (2007-07-17 12:13) [4]


> Вроде я так и делаю


Так то оно так, да вот сама декларация структуры SP_DEVICE_INTERFACE_DETAIL_DATA под сомнением ..


 
MBo ©   (2007-07-17 12:20) [5]

а более простые способы не подойдут, например, с использованием
QueryDosDevice или из реестра читать HARDWARE\DEVICEMAP\SERIALCOMM


 
Artog   (2007-07-17 12:29) [6]

>QueryDosDevice или из реестра читать HARDWARE\DEVICEMAP\SERIALCOMM

QueryDosDevice не возвращает friendly name.

>Тык вот, попробуй цикл, где с некоторого нижнего порога наращивается переменная

Действительно, оказался не тот размер структуры.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.047 c
15-1201973141
Maloj2007
2008-02-02 20:25
2008.03.09
Копирование и вставка в компоненте TRichViewEdit


3-1192715486
Evgeny
2007-10-18 17:51
2008.03.09
Как сделать SQL запрос на выборку всех записей таблицы на этой не


15-1202111721
Valentina_HR
2008-02-04 10:55
2008.03.09
поомгите найти программиста Delphi!!! (Санкт-Петербург)


2-1202681835
Бэтман
2008-02-11 01:17
2008.03.09
Дата


11-1166529914
2expres
2006-12-19 15:05
2008.03.09
Таймер на 10мс.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский