Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #6  
Старый 07.11.2012, 14:09
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Раз оно 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;
Это из одного моего проекта "на коленке". vid_0483&pid_5750 - соответственно VID и PID устройства, можно получить в диспетчере устройств. Обязательно четырехзначные. Код был восстановлен по дизасу и декомпайлу немецкой проги, работавшей с тем же девайсом.
Дальше все просто: чтение - ReadFile, запись - WriteFile, закрытие - CloseHandle.
Тут опять же придется реверсить протокол обмена. Можно попробовать какой-нибудь USB-сниффер или реверсить код. Я бы со снифферами не связывался.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 07.11.2012 в 14:11.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025