我正在尝试使用SetupDi函数来枚举所有连接的USB设备的设备path。 设备path是CreateFile()中使用的path,所以我可以与设备进行通信。
但是, SetupDiGetDeviceInterface需要一个接口GUID,但我并不特别寻找特定的接口(除了所有连接的USB)。 这部分已被评论为/ * ??? * /在下面的源代码中。
尝试解决scheme:
我尝试提供GUID_DEVCLASS_UNKNOWN = {0x4d36e97e,0xe325,0x11ce,{0xbf,0xc1,0x08,0x00,0x2b,0xe1,0x03,0x18}}; 但是这抛出了一个“没有更多的接口”的错误。
我也尝试提供deviceInfoData.ClassGuid到SetupDiGetDeviceInterface,但我得到了同样的错误,如上所述,“没有更多的接口”。
问题:
是否有覆盖所有USB设备的通用接口类? (HID,通用等)
还是有一个替代function,将给我的设备的path? (由SetupDiGetDeviceInterfaceDetail返回的SP_DEVICE_INTERFACE_DETAIL_DATA结构的Instread)。
资源:
HDEVINFO deviceInfoList SP_DEVINFO_DATA deviceInfoData; deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); SP_DEVICE_INTERFACE_DATA deviceInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData = NULL; DWORD requiredLength = 0; char *hardwareID = 0; // Retrieve a list of all present devices deviceInfoList = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES); if (deviceInfoList == INVALID_HANDLE_VALUE) { SetupDiDestroyDeviceInfoList(deviceInfoList); return false; } // Iterate over the list for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) { if (deviceInterfaceDetailData) LocalFree(deviceInterfaceDetailData); requiredLength = 0; SetupDiGetDeviceRegistryProperty(deviceInfoList, &deviceInfoData, SPDRP_HARDWAREID, &DataT, NULL, 0, &requiredLength); if (requiredLength <= 0) { SetupDiDestroyDeviceInfoList(deviceInfoList); return false; } hardwareID = new char[requiredLength](); SetupDiGetDeviceRegistryProperty(deviceInfoList, &deviceInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)hardwareID, requiredLength, NULL); // Parse hardwareID for vendor ID and product ID delete hardwareID; hardwareID = 0; deviceInterfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); // Requires an interface GUID, for which I have none to specify if (!SetupDiEnumDeviceInterfaces(deviceInfoList, &deviceInfoData, /* ??? */, 0, &deviceInterfaceData)) { SetupDiDestroyDeviceInfoList(deviceInfoList); return false; } if (!SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInterfaceData, NULL, 0, &requiredLength, NULL)) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER && requiredLength > 0) { deviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, requiredLength); if (!deviceInterfaceDetailData) { SetupDiDestroyDeviceInfoList(deviceInfoList); return false; } } else { SetupDiDestroyDeviceInfoList(deviceInfoList); return false; } } deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); if (!SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInterfaceData, deviceInterfaceDetailData, requiredLength, NULL, &deviceInfoData)) { SetupDiDestroyDeviceInfoList(deviceInfoList); return false; } SetupDiDestroyDeviceInfoList(deviceInfoList); // deviceInterfaceDetailData->DevicePath yields the device path }
MSDN说有一个通用的USB设备接口类GUID_DEVINTERFACE_USB_DEVICE
GUID {A5DCBF10-6530-11D2-901F-00C04FB951ED}
:
系统提供的USB集线器驱动程序注册GUID_DEVINTERFACE_USB_DEVICE的实例,以通知系统和应用程序存在连接到USB集线器的USB设备。
下面是一个代码示例 ,它使用DEVINTERFACE_USB_DEVICE GUID来执行您想要执行的操作。