rita12312 2021-01-10 15:03 采纳率: 0%
浏览 27

USB设备枚举,在32位系统下无法枚举到插入2.0口的所有设备。

   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);
            }
        }

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 16:38
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码在C#中使用了System.IO.FileSystem.IO.Compression.ZipFile库。这段代码的主要目的是从一个名为HubDevicePath的文件路径获取所有支持USB设备(即2.0口)的设备信息,并将这些信息存储在一个列表中。

    然而,当尝试在32位系统上运行此代码时,它会遇到错误:InvalidOperationException: The handle cannot be closed because it is currently in use. 这是因为操作系统不允许同时打开多个文件句柄,而这个函数需要在关闭文件句柄之前完成工作。

    为了解决这个问题,你可以考虑以下几种方法:

    1. 将数据结构转换为非托管代码,以便在.NET Core或.NET Framework环境中使用。这样可以避免跨平台兼容性问题。

    2. 使用Windows API来实现更高级的功能,例如使用GetCommPortInfo()函数来获取USB设备的信息。

    3. 在不使用任何第三方库的情况下,尝试使用Process.Start()函数来执行命令行命令,这可能会有较高的性能开销,但可以在不依赖于第三方库的情况下提供解决方案。

    4. 如果可能的话,尝试使用64位版本的.NET框架或者移植到其他平台。

    评论

报告相同问题?