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;