![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день!
Никак не могу понять в чём проблема, один и тот же код работает на Delphi 5 и не работает на Delphi 2010. Код перебирает подключённые HID-устройства и находит нужное. Код:
lcHDevInfo:=SetupDiGetClassDevs(@C_GUID_CLASS_USB_DEVICE, nil, 0, DIGCF_PRESENT OR DIGCF_DEVICEINTERFACE);
if lcHDevInfo=Pointer(INVALID_HANDLE_VALUE) then Exit;
try
i:=0;
lcDevInfoData.cbSize:=SizeOf(TSPDevInfoData);
lcDevInterfData.cbSize:=SizeOf(TSPDeviceInterfaceData);
while SetupDiEnumInterfaceDevice(lcHDevInfo, nil, C_GUID_CLASS_USB_DEVICE, i, lcDevInterfData) do
try
lcSize:=0;
SetupDiGetDeviceInterfaceDetail(lcHDevInfo, @lcDevInterfData, nil, 0, lcSize, nil);
if lcSize=0 then Continue;
try
GetMem(lcDevInterfDetailData, lcSize);
lcDevInterfDetailData.cbSize:=SizeOf(TSPDeviceInterfaceDetailData);
if not SetupDiGetDeviceInterfaceDetail(lcHDevInfo, @lcDevInterfData, lcDevInterfDetailData, lcSize, lcSize, @lcDevInfoData) then Continue;
lcDevPath:=lcDevInterfDetailData.DevicePath;
lcHandle:=CreateFile(lcDevPath, GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if lcHandle=INVALID_HANDLE_VALUE then Continue;
try
lcAttributes.Size:=SizeOf(THidDAttributes);
if not HidD_GetAttributes(lcHandle, lcAttributes) then Continue;
if (lcAttributes.VendorID<>C_MY_VID) then Continue;
//дальнейшие вычитывания
finally
CloseHandle(lcHandle);
end;
finally
FreeMem(lcDevInterfDetailData);
end;
finally
Inc(i);
end;
finally
SetupDiDestroyDeviceInfoList(lcHDevInfo);
end;Кто-нибудь сталкивался? ![]() |
|
#2
|
|||
|
|||
|
Тип lcDevPath какой?
Не забываем, что D2010 вся из себя такая юникодная... |
|
#3
|
|||
|
|||
|
lcDevPath PChar
Разобрался, в чём дело. Из-за C_GUID_CLASS_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}'; функция SetupDiGetDeviceInterfaceDetail возвращала неполный путь к устройству. Проблема ушла с HidD_GetHidGuid, которая возвращает другой GUID. |