Показать сообщение отдельно
  #4  
Старый 27.01.2013, 22:01
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Если устройство HID - то как-то так:
Код:
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;
end;
Ну а потом чтение/запись стандартным ReadFile/WriteFile.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием