如何测试 USB HID 句柄由于设备被重新插入而无效
How to test USB HID handle as invalid due to device being replugged
在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 设备的指示器。
相关文章:
- 在二叉搜索树中插入新元素
- 插入容器的容器(如果是新的或附加到现有容器)
- 插入新键时,它会更改现有键值的地址吗?
- 如果我们不创建一个新节点并使用指针插入数据并建立链接(在链表中)怎么办?
- 如何在使用 ItemType 的模板类时将新节点插入二叉树 c++.(我是 c++ 的新手)
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- 有没有办法通过插入新类型名称而不是 int 来使用 2 位大小类型而不是 int?
- 通过字符串::插入插入字符时出错
- 在指向对象的指针的动态数组上插入新元素
- 在动态分配的二维矩阵中插入新列
- 新元素将在std :: set中插入哪里
- 在unordered_map/unordered_set中插入/放置新元素时的提示
- 插入新元素时结束迭代器会获得更新
- 将unordered_map的新实例插入到unordered_map中
- 新的STD :: MAP条目如何仅通过键插入初始化
- 在插入后与插入插入插件后对矢量进行排序
- C++链表——如何将每个新数据插入尾部
- 将新元素插入哈希表
- 在运行递归函数时将新元素插入向量时出现问题
- 为什么在尝试将新节点插入列表时出错