C++ MFC工具获取USB设备父设备信息技术求助
获取USB设备父设备信息的解决方案
你已经用SetupAPI搞定了设备描述、硬件ID这些信息,卡在父设备这里其实很好解决——核心是用到Cfgmgr32.dll里的设备实例管理函数,和你已经在用的CM_Get_Device_ID属于同一套API体系。下面是具体的实现步骤和代码示例,直接可以整合到你的现有代码里:
核心思路
- 通过
CM_Get_Parent函数,从当前USB设备的DevInst(设备实例句柄)获取其父设备的DevInst。 - 拿到父设备的
DevInst后,就可以用你熟悉的方法(比如CM_Get_Device_ID、CM_Get_Device_Registry_Property)获取父设备的实例ID、描述、硬件ID等信息。 - 如果需要遍历完整的设备层级(比如USB设备→USB Hub→Root Hub),可以递归调用
CM_Get_Parent直到没有父设备为止。
代码示例(整合到你的现有代码中)
在你获取到DeviceInfoData.DevInst之后,添加以下代码:
// 记得包含头文件:#include <Cfgmgr32.h> // 链接时需要添加Cfgmgr32.lib(VS项目属性→链接器→输入→附加依赖项) DEVINST parentDevInst; // 获取父设备的DevInst CONFIGRET cr = CM_Get_Parent(&parentDevInst, DeviceInfoData.DevInst, 0); if (cr == CR_SUCCESS) { // 获取父设备的实例ID TCHAR szParentDeviceID[MAX_PATH] = {0}; cr = CM_Get_Device_ID(parentDevInst, szParentDeviceID, MAX_PATH, 0); if (cr == CR_SUCCESS) { _tprintf(TEXT(" 父设备实例ID: \"%ls\"\n"), szParentDeviceID); // 获取父设备的描述信息 TCHAR szParentDesc[MAX_PATH] = {0}; ULONG ulDescSize = sizeof(szParentDesc) / sizeof(TCHAR); cr = CM_Get_Device_Registry_Property(parentDevInst, CM_DRP_DEVICEDESC, NULL, szParentDesc, &ulDescSize, 0); if (cr == CR_SUCCESS) { _tprintf(TEXT(" 父设备描述: \"%ls\"\n"), szParentDesc); } else { _tprintf(TEXT(" 获取父设备描述失败,错误码: 0x%08X\n"), cr); } // 如果你需要父设备的硬件ID,用CM_DRP_HARDWAREID参数 TCHAR szParentHardwareID[1024] = {0}; ULONG ulHwIdSize = sizeof(szParentHardwareID) / sizeof(TCHAR); cr = CM_Get_Device_Registry_Property(parentDevInst, CM_DRP_HARDWAREID, NULL, szParentHardwareID, &ulHwIdSize, 0); if (cr == CR_SUCCESS) { _tprintf(TEXT(" 父设备硬件ID: \"%ls\"\n"), szParentHardwareID); } else { _tprintf(TEXT(" 获取父设备硬件ID失败,错误码: 0x%08X\n"), cr); } } else { _tprintf(TEXT(" 获取父设备实例ID失败,错误码: 0x%08X\n"), cr); } } else if (cr == CR_NO_SUCH_DEVINST) { _tprintf(TEXT(" 当前设备没有父设备(比如USB Root Hub)\n")); } else { _tprintf(TEXT(" 获取父设备失败,错误码: 0x%08X\n"), cr); }
关键细节说明
- CM_Get_Parent:这个函数是核心,它通过当前设备的实例句柄找到直接父设备的实例句柄。返回值
CONFIGRET是Windows设备配置函数的标准返回类型,CR_SUCCESS表示成功,CR_NO_SUCH_DEVINST表示当前设备没有父设备。 - CM_Get_Device_Registry_Property:和
SetupDiGetDeviceRegistryProperty类似,但直接通过DevInst获取设备注册表属性,不需要依赖HDEVINFO集合,适合单独获取父设备的属性。 - 如果你想把父设备关联到你已有的
HDEVINFO设备集合中,可以用SetupDiOpenDeviceInfo函数,传入父设备的实例ID,得到对应的SP_DEVINFO_DATA,然后继续用你之前的SetupDiGetDevicePropertyW等函数。
内容的提问来源于stack exchange,提问作者TiYan
相关产品推荐
相关产品推荐

