Открываю USB устройство через его GUID.
Все открывается и работает.
Но! Любая прога также может открыть это устройство, и тогда, естественно, начинаются глюки.
Нужно либо как то узнать, открыто ли кем-то уже данное устройство, либо как-то открывать с эксклюзивными правами. Но как ?
Код ниже. CreateFile вроде открывает в эксклюзивном режиме, но это не мешает открыть устройство повторно.
function getGUIDevHandle(s:string; dNum:integer):dword;
var
GD:TGUID;
devInfoData:SP_DEVINFO_DATA;
devInterfaceData:SP_DEVICE_INTERFACE_DATA;
functionClassDeviceData:PSPInterfaceDeviceDetailData;
requiredLength:dword;
deviceNumber:integer;
hwDeviceInfo:HDEVINFO;
predictedLength:cardinal;
ok:boolean;
begin
result:=0;
GD:=GUIStrToGUID(s);
requiredLength:= 0;
deviceNumber:= dNum; // Can be other values if more than 1 device connected to driver
hwDeviceInfo := SetupDiGetClassDevs (@GD, Nil, 0, DIGCF_PRESENT or DIGCF_INTERFACEDEVICE);
if (cardinal(hwDeviceInfo) <> INVALID_HANDLE_VALUE)
then begin
devInterfaceData.cbSize := sizeof(devInterfaceData);
if (SetupDiEnumDeviceInterfaces ( hwDeviceInfo, Nil, GD, deviceNumber, devInterfaceData))
then begin
inc (deviceNumber);
//SetupDiGetInterfaceDeviceDetail
SetupDiGetDeviceInterfaceDetail( hwDeviceInfo, @devInterfaceData, Nil, 0, requiredLength, Nil);
predictedLength := requiredLength;
functionClassDeviceData := PSPInterfaceDeviceDetailData( GlobalAlloc (GPTR, predictedLength));
functionClassDeviceData^.cbSize := sizeof (TSPDeviceInterfaceDetailData); //???? - все ок
devInfoData.cbSize := sizeof(devInfoData);
if (SetupDiGetDeviceInterfaceDetail (hwDeviceInfo,
@devInterfaceData,
functionClassDeviceData,
predictedLength,
requiredLength,
@devInfoData))
then begin
Result:= CreateFile( functionClassDeviceData^.DevicePath,
GENERIC_WRITE or GENERIC_READ,
0, //FILE_SHARE_WRITE or FILE_SHARE_READ,
Nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
end;
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
В том то и дело, что CloseHandle не делаю (делается только при выходе из проги).
По всем признакам устройство должно быть открыто в эксклюзивном режиме (см. код в начале). Но тем не менее, что из этой же проги, что из любой другой вышеописанным кодом это устройство открывается.
Причем с каждой из прог оно будет работать, если они по очереди шлют запросы но, тут естественно, если шлют запросы одновременно - получается ерунда.
Мне бы хотя бы как-нибудь узнать, открыто ли оно кем-то еще. Как-то проги типа файл-монитора делают подобные вещи.
Дело в том что это не мешает другим прогам также открывать это устройство. А несколько прог его открыли и работают с ним, то, разумеется, друг другу мешают. Нужно чтобы устройство могло быть открыто только одной прогой.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.