是否有一种简单有效的方法可以在 C# 或 C/C++ 中列出所有 USB 设备?
Posted
技术标签:
【中文标题】是否有一种简单有效的方法可以在 C# 或 C/C++ 中列出所有 USB 设备?【英文标题】:Is there a simple and efficient way to get listed all usb devices in C# or C/C++? 【发布时间】:2013-11-16 17:52:15 【问题描述】:我必须制作一个监控 USB 端口的程序,当插入 USB 设备(手柄、闪存驱动器、鼠标、ecc...)时,我会得到一个唯一标识符(设备 ID 或其他东西会很好)。 起初,我尝试使用 C# 使用 system.management 类并每秒查询 cim_logicaldevice 类以插入新设备。 某些设备返回了更多带有 DeviceID 的行,但这不是问题。问题是程序(在任务管理器中)占用的内存不断增长。 这是源代码:http://pastebin.com/dQv3cMQC
有没有办法避免内存使用量的增长? 我必须用 C++ 或 C# 编写这个程序,而且它必须尽可能高效(因为它必须永远打开)。
【问题讨论】:
只是一些笔记。注意1:任务管理器在跟踪内存方面不是很准确。注意 2:考虑将一次性对象包含在 using(DisposableObject obj = new DisposableObject()) 中,而不是直接调用 Dispose 注意 3:仅出于调试目的调用 GC,完整的 GC 收集通过 3 步 GC.Collect( ); GC.WaitForPendingFinalizer(); GC.Collect(); 使用控制台跟踪使用的内存量在我看来内存相当稳定 如果您的目标是最大效率(内存方面),请不要使用 c# 我也用过using(),不过好像是System.Management搜索器的get方法有问题。 我已经知道任务管理器不是很准确,但我认为使用的内存增长是真实的。我也知道 C# 不是最适合我的语言,所以我找到了 libusbx 库,我正在用 C 编写程序。 【参考方案1】:我建议查看 WDK 中的 USBView 示例。如果您对此不熟悉,只需运行它 - 这个工具会遍历系统上的整个 USB 树,并打印出每个设备的信息和描述符列表。
在您的情况下,我将从本示例中的 RefreshTree() 函数开始,然后您可以按照代码查看它如何枚举主机控制器、集线器和最终设备。对于您找到的每个设备,您可以查看接口描述符中的 bInterfaceClass 以找出它正在宣传的接口类型。
获取此示例源代码的最简单方法是安装 7.1.0 WDK,目前可在此处获得:http://www.microsoft.com/en-us/download/details.aspx?id=11800
【讨论】:
以上是关于是否有一种简单有效的方法可以在 C# 或 C/C++ 中列出所有 USB 设备?的主要内容,如果未能解决你的问题,请参考以下文章