【问题标题】:How to test USB HID handle as invalid due to device being replugged由于重新插入设备,如何测试 USB HID 句柄无效
【发布时间】:2019-04-09 23:30:44
【问题描述】:

在 Windows 7 中,我有一个自定义 USB HID 设备的句柄。我正在尝试确定手柄是否不再能够访问设备,因为设备已被拔出并重新插入。发生这种情况时,使用 WriteFile 的 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) Invalid Function

即使设备已断开/重新连接并且句柄无法访问设备,GetHandleInformation 也始终成功。

【问题讨论】:

  • 您是否使用 CreateFile 创建了句柄?如果是这样,您可以尝试 GetFileInformationByHandle。
  • @TonyJ 是的,它是使用 CreateFile 创建的,但是我已经尝试使用 GetFileInformationByHandle,它总是返回 0(失败),GetLastError() = 1 Invalid Function。句柄好和无效时都返回0

标签: c++ windows usb handle hid


【解决方案1】:

使用的电话是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 设备的指示符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2013-04-05
    • 2011-11-02
    相关资源
    最近更新 更多