![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#6
|
||||
|
||||
![]() Раз оно HID - варианта два. Первый - использовать ту же библиотеку, что юзают разработчики (Jvhidcontrollerclass). Тут придется реверсить способ работы с этим компонентом (т.к. я особо по нему ничего в гугле не нашел, хотя не особо искал) и протокол.
Второй: Код:
procedure TfrmMultiMeter.tbConnectClick(Sender: TObject); var devSet: integer; i, uBytes: integer; spdt: SP_DEVICE_INTERFACE_DATA; begin if connected then begin MessageBoxA(0, 'Вы уже подключены к устройству.', 'Ошибка!', 0); exit; end; hHid := LoadLibrary('Hid.dll'); if hHid = 0 then begin MessageBoxA(0, 'Не удалось загрузить библиотеку Hid.dll', 'Ошибка!', 0); exit; end; hSetupAPI := LoadLibrary('SetupAPI.dll'); if hSetupAPI = 0 then begin DoDisconnect(); MessageBoxA(0, 'Не удалось загрузить библиотеку SetupAPI.dll', 'Ошибка!', 0); exit; end; HidD_GetHidGuid := GetProcAddress(hHid, 'HidD_GetHidGuid'); SetupDiGetClassDevsA := GetProcAddress(hSetupAPI, 'SetupDiGetClassDevsA'); SetupDiDestroyDeviceInfoList := GetProcAddress(hSetupAPI, 'SetupDiDestroyDeviceInfoList'); SetupDiEnumDeviceInterfaces := GetProcAddress(hSetupAPI, 'SetupDiEnumDeviceInterfaces'); SetupDiGetDeviceInterfaceDetailA := GetProcAddress(hSetupAPI, 'SetupDiGetDeviceInterfaceDetailA'); if (not assigned(HidD_GetHidGuid)) or (not assigned(SetupDiGetClassDevsA)) or (not assigned(SetupDiDestroyDeviceInfoList)) or (not assigned(SetupDiEnumDeviceInterfaces)) or (not assigned(SetupDiGetDeviceInterfaceDetailA)) then begin DoDisconnect(); MessageBoxA(0, 'Не удалось получить адрес функции.', 'Ошибка!', 0); exit; end; HidD_GetHidGuid(@Hg); devSet := SetupDiGetClassDevsA(@Hg, 0, 0, $12); if devSet = -1 then begin DoDisconnect(); MessageBoxA(0, 'Не получен список устройств.', 'Ошибка!', 0); exit; end; i := 0; spdt.cbSize := sizeof(spdt); while SetupDiEnumDeviceInterfaces(devSet, 0, @Hg, i, @spdt) do begin SetupDiGetDeviceInterfaceDetailA(devSet, @spdt, 0, 0, @uBytes, 0); if (uBytes <> 0) and (GetLastError() = 122) then begin GetMem(pSpDDT, uBytes); pSpDDT^.cbSize := 5; SetupDiGetDeviceInterfaceDetailA(devSet, @spdt, pSpDDT, uBytes, @uBytes, 0); if (pos('vid_0483&pid_5750', PAnsiChar(@(pSpDDT^.DevicePath))) <> 0) then break; FreeMem(pSpDDT); pSpDDT := 0; end; inc(i); end; SetupDiDestroyDeviceInfoList(devSet); if pSpDDT = nil then begin DoDisconnect(); MessageBoxA(0, 'Устройство vid_0483&pid_5750 не найдено.', 'Ошибка!', 0); exit; end; hMM := CreateFileA(PAnsiChar(@(pSpDDT^.DevicePath)), GENERIC_READ or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); if hMM = 0 then begin DoDisconnect(); MessageBoxA(0, 'Не удалось открыть устройство.', 'Ошибка!', 0); exit; end; hEvt := CreateEvent(0, true, false, 0); ResetEvent(hEvt); ovlp.Offset := 0; ovlp.OffsetHigh := 0; ovlp.hEvent := hEvt; reading := false; connected := true; tmRead.Enabled := true; end; Дальше все просто: чтение - ReadFile, запись - WriteFile, закрытие - CloseHandle. Тут опять же придется реверсить протокол обмена. Можно попробовать какой-нибудь USB-сниффер или реверсить код. Я бы со снифферами не связывался. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 07.11.2012 в 14:11. |