Главная страница
    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.039 c
2-1202796912
жорик
2008-02-12 09:15
2008.03.09
открыт ли файл


2-1202742959
alexsashkan
2008-02-11 18:15
2008.03.09
Выборка из нескольких таблиц,с вычисляемым полем


2-1202887841
Akex
2008-02-13 10:30
2008.03.09
отмена логина в веб-сервис


15-1202032040
asdqwer
2008-02-03 12:47
2008.03.09
vcl100.bpl для RAD Studio


2-1202772539
Abcdef123
2008-02-12 02:28
2008.03.09
Вопрос по Exception.





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