You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ MFC工具获取USB设备父设备信息技术求助

获取USB设备父设备信息的解决方案

你已经用SetupAPI搞定了设备描述、硬件ID这些信息,卡在父设备这里其实很好解决——核心是用到Cfgmgr32.dll里的设备实例管理函数,和你已经在用的CM_Get_Device_ID属于同一套API体系。下面是具体的实现步骤和代码示例,直接可以整合到你的现有代码里:

核心思路

  1. 通过CM_Get_Parent函数,从当前USB设备的DevInst(设备实例句柄)获取其父设备的DevInst。
  2. 拿到父设备的DevInst后,就可以用你熟悉的方法(比如CM_Get_Device_ID、CM_Get_Device_Registry_Property)获取父设备的实例ID、描述、硬件ID等信息。
  3. 如果需要遍历完整的设备层级(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:50:33