检索设备实例标识符

在 Windows Vista 及更高版本的 Windows 中, 统一设备属性模型 支持表示设备实例标识符的设备属性。 统一设备属性模型使用 DEVPKEY_Device_InstanceId属性键 来表示此属性。

Windows Server 2003、Windows XP 和 Windows 2000 也支持此属性。 但是,这些早期 Windows 版本不支持统一设备属性模型的属性键。 相反,可以通过调用 CM_Get_Device_IDSetupDiGetDeviceInstanceId 在这些早期版本的 Windows 上检索设备实例标识符。 为了保持与这些早期版本的 Windows 的兼容性,Windows Vista 和更高版本还支持 CM_Get_Device_IDSetupDiGetDeviceInstanceId。 但是,你应该使用相应的属性键在 Windows Vista 及更高版本上访问此属性。

有关如何使用属性键访问 Windows Vista 及更高版本上的设备驱动程序属性的信息,请参阅 访问 Windows Vista 和更高版本) (设备实例属性

若要在 Windows Server 2003、Windows XP 和 Windows 2000 上检索设备实例标识符,请参阅以下示例。

设备实例标识符字符串必须小于 MAX_DEVICE_ID_LEN 字符 (包括 cfgmgr32.h 中定义的 NULL) 。 可以使用该假设通过以下代码查询设备实例标识符:

WCHAR DeviceInstancePath[MAX_DEVICE_ID_LEN];

cr = CM_Get_Device_ID(DevInst,
                      DeviceInstancePath,
                      sizeof(DeviceInstancePath)/sizeof(DeviceInstancePath[0]),
                      0);

if (cr != CR_SUCCESS) {
    printf("Error 0x%08x retrieving device instance path.\n", cr);
} else {
    printf("Device instance path is %ws.\n", DeviceInstancePath);
}

或者,如果希望动态调整缓冲区大小::

ULONG DeviceInstancePathLength = 0;
PWSTR DeviceInstancePath = NULL;

cr = CM_Get_Device_ID_Size(&DeviceInstancePathLength,
                           DevInst,
                           0);

if (cr != CR_SUCCESS) {
    printf("Error 0x%08x retrieving device instance path size.\n", cr);
} else {
    DeviceInstancePath = (PWSTR)malloc(DeviceInstancePathLength * sizeof(WCHAR));

    if (DeviceInstancePath != NULL) {
        cr = CM_Get_Device_ID(DevInst,
                              DeviceInstancePath,
                              DeviceInstancePathLength,
                              0);

        if (cr != CR_SUCCESS) {
            printf("Error 0x%08x retrieving device instance path.\n", cr);
        } else {
            printf("Device instance path is %ws.\n", DeviceInstancePath);
        }
    }
}