Форум: "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.045 c