
22.03.2012, 17:48
|
Прохожий
|
|
Регистрация: 22.03.2012
Сообщения: 2
Репутация: 10
|
|
CreateFile Delphi 2010 (USB)
Добрый день!
Никак не могу понять в чём проблема, один и тот же код работает на 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;
В Delphi 2010 просто не проходит CreateFile (GetLastError выдаёт 31). На том же компьютере под Delphi 5 всё работает как часы. Система Windows 7.
Кто-нибудь сталкивался? 
|