检索设备实例标识符
在 Windows Vista 及更高版本的 Windows 中, 统一设备属性模型 支持表示设备实例标识符的设备属性。 统一设备属性模型使用 DEVPKEY_Device_InstanceId属性键 来表示此属性。
Windows Server 2003、Windows XP 和 Windows 2000 也支持此属性。 但是,这些早期 Windows 版本不支持统一设备属性模型的属性键。 相反,可以通过调用 CM_Get_Device_ID 或 SetupDiGetDeviceInstanceId 在这些早期版本的 Windows 上检索设备实例标识符。 为了保持与这些早期版本的 Windows 的兼容性,Windows Vista 和更高版本还支持 CM_Get_Device_ID 和 SetupDiGetDeviceInstanceId。 但是,你应该使用相应的属性键在 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);
}
}
}