Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.09;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2008.03.09;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.031 c
4-1184247411
GTR86
2007-07-12 17:36
2008.03.09
Номер винчестера


6-1182092002
Степан
2007-06-17 18:53
2008.03.09
Узнать название подключения по IP


2-1202994122
Konst5719
2008-02-14 16:02
2008.03.09
Tray (Taskbar Notification Area)


15-1201843206
Uno-84
2008-02-01 08:20
2008.03.09
Удаленный отладчик


2-1202719916
Kolan
2008-02-11 11:51
2008.03.09
Как узнать какие именно пакеты нужны приложению?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский