在Windows 7中,我有一个自定义USB HID设备的句柄。 我正在尝试确定句柄是否不再能够访问设备,因为设备已被拔出并重新插入。 发生这种情况时,使用写入文件的 I/O 尝试将失败。 但是,我正在寻找一种方法在执行任何I/O以确定HID设备句柄是否仍然有效之前测试句柄。 当我说有效时,我的意思是句柄连接到设备,以便我能够对设备进行I/O。 我知道从技术上讲,即使句柄失去与物理设备的连接,句柄本身也可能有效。 我的代码中的当前方法是通过使用尝试打开设备的新句柄进行测试,如果成功,则句柄有效,如果失败,则句柄无效。 如果在测试时拔下设备,这将按预期检测断开连接。这样做的问题是,如果设备已重新插入,则测试打开成功,但用于执行 I/O 的实际句柄(在断开连接/重新连接之前打开)不再连接到设备。 我正在寻找一个可以使用实际 I/O 句柄执行的良性调用,该句柄将告诉我设备是否已连接,但不执行任何实际 I/O。
到目前为止,我已经尝试了几次调用,但没有一个返回我所需的设备连接指示。
DWORD handleInformation;
LARGE_INTEGER size = { 0, 0 };
BOOL isConnected;
isConnected = GetFileSizeEx(m_HidWriteHandle, &size);
isConnected = GetHandleInformation(m_HidWriteHandle, &handleInformation);
GetFileSizeEx 总是失败,并且 GetLastError() 报告 (1) 函数无效
即使设备已断开连接/重新连接并且句柄无法访问设备,GetHandleInformation 也始终成功。
要使用的调用是 HidD_GetAttributes(handle, &attributes)
// Try to get the HID attributes. This will fail if device is
// unplugged or has been unplugged since CreateFile() call that
// created m_HidWritehandle
HIDD_ATTRIBUTES Attributes;
Attributes.Size = sizeof(Attributes);
m_HidPresent = HidD_GetAttributes(m_HidWriteHandle, &Attributes) != 0;
即使设备已重新插入,这也将返回 false,因此可以用作需要重新连接到 HID 设备的指示器。