public System.Collections.ObjectModel.ReadOnlyCollection<USBPort> GetPorts()
{
List<USBPort> PortList = new List<USBPort>();
IntPtr h = CreateFile(HubDevicePath, GENERIC_WRITE, FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
if (h.ToInt32() != INVALID_HANDLE_VALUE)
{
int nBytes = Marshal.SizeOf(typeof(USB_NODE_CONNECTION_INFORMATION_EX));
IntPtr ptrNodeConnection = Marshal.AllocHGlobal(nBytes);
for (int i = 1; i <= HubPortCount; i++)
{
int nBytesReturned;
USB_NODE_CONNECTION_INFORMATION_EX NodeConnection = new USB_NODE_CONNECTION_INFORMATION_EX();
NodeConnection.ConnectionIndex = i;
Marshal.StructureToPtr(NodeConnection, ptrNodeConnection, true);
if (DeviceIoControl(h, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, ptrNodeConnection, nBytes, ptrNodeConnection, nBytes, out nBytesReturned, IntPtr.Zero))
{
NodeConnection = (USB_NODE_CONNECTION_INFORMATION_EX)Marshal.PtrToStructure(ptrNodeConnection, typeof(USB_NODE_CONNECTION_INFORMATION_EX));
USBPort port = new USBPort();
port.PortPortNumber = i;
port.PortHubDevicePath = HubDevicePath;
USB_CONNECTION_STATUS Status = (USB_CONNECTION_STATUS)NodeConnection.ConnectionStatus;
port.PortStatus = Status.ToString();
USB_DEVICE_SPEED Speed = (USB_DEVICE_SPEED)NodeConnection.Speed;
port.PortSpeed = Speed.ToString();
port.PortIsDeviceConnected = (NodeConnection.ConnectionStatus == (int)USB_CONNECTION_STATUS.DeviceConnected);
port.PortIsHub = Convert.ToBoolean(NodeConnection.DeviceIsHub);
port.PortDeviceDescriptor = NodeConnection.DeviceDescriptor;
PortList.Add(port);
}
}
Marshal.FreeHGlobal(ptrNodeConnection);
CloseHandle(h);
}
return new System.Collections.ObjectModel.ReadOnlyCollection<USBPort>(PortList);
}
}
USB设备枚举,在32位系统下无法枚举到插入2.0口的所有设备。
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
你知我知皆知 2024-07-24 16:38关注以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
这段代码在C#中使用了
System.IO.File和System.IO.Compression.ZipFile库。这段代码的主要目的是从一个名为HubDevicePath的文件路径获取所有支持USB设备(即2.0口)的设备信息,并将这些信息存储在一个列表中。然而,当尝试在32位系统上运行此代码时,它会遇到错误:
InvalidOperationException: The handle cannot be closed because it is currently in use.这是因为操作系统不允许同时打开多个文件句柄,而这个函数需要在关闭文件句柄之前完成工作。为了解决这个问题,你可以考虑以下几种方法:
-
将数据结构转换为非托管代码,以便在.NET Core或.NET Framework环境中使用。这样可以避免跨平台兼容性问题。
-
使用Windows API来实现更高级的功能,例如使用
GetCommPortInfo()函数来获取USB设备的信息。 -
在不使用任何第三方库的情况下,尝试使用
Process.Start()函数来执行命令行命令,这可能会有较高的性能开销,但可以在不依赖于第三方库的情况下提供解决方案。 -
如果可能的话,尝试使用64位版本的.NET框架或者移植到其他平台。
解决 无用评论 打赏 举报-