Получение идентификатора экземпляра устройства
В Windows Vista и более поздних версиях Windows модель унифицированных свойств устройства поддерживает свойство устройства, представляющее идентификатор экземпляра устройства. Унифицированная модель свойств устройства использует ключ свойстваDEVPKEY_Device_InstanceId для представления этого свойства.
Windows Server 2003, Windows XP и Windows 2000 также поддерживают это свойство. Однако эти более ранние версии Windows не поддерживают ключ свойств унифицированной модели свойств устройства. Вместо этого можно получить идентификатор экземпляра устройства в этих более ранних версиях Windows, вызвав CM_Get_Device_ID или SetupDiGetDeviceInstanceId. Для обеспечения совместимости с этими более ранними версиями 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
символов (включая NULL), определенных в cfgmgr32.h. Это предположение можно использовать для запроса идентификатора экземпляра устройства с помощью следующего кода:
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);
}
}
}