Condividi tramite


Recupero di un identificatore di istanza del dispositivo

In Windows Vista e versioni successive di Windows, il modello di proprietà del dispositivo unificato supporta una proprietà del dispositivo che rappresenta l'identificatore dell'istanza del dispositivo. Il modello di proprietà del dispositivo unificato usa la chiave della proprietàDEVPKEY_Device_InstanceId per rappresentare questa proprietà.

Windows Server 2003, Windows XP e Windows 2000 supportano anche questa proprietà. Tuttavia, queste versioni precedenti di Windows non supportano la chiave di proprietà del modello di proprietà del dispositivo unificato. È invece possibile recuperare un identificatore di istanza del dispositivo in queste versioni precedenti di Windows chiamando CM_Get_Device_ID o SetupDiGetDeviceInstanceId. Per mantenere la compatibilità con queste versioni precedenti di Windows, Windows Vista e versioni successive supportano anche CM_Get_Device_ID e SetupDiGetDeviceInstanceId. Tuttavia, è consigliabile usare la chiave di proprietà corrispondente per accedere a questa proprietà in Windows Vista e versioni successive.

Per informazioni su come usare le chiavi delle proprietà per accedere alle proprietà dei driver di dispositivo in Windows Vista e versioni successive, vedere Accesso alle proprietà dell'istanza del dispositivo (Windows Vista e versioni successive).

Per recuperare un identificatore di istanza del dispositivo in Windows Server 2003, Windows XP e Windows 2000, vedere gli esempi seguenti.

Le stringhe dell'identificatore dell'istanza del dispositivo devono essere minori di MAX_DEVICE_ID_LEN caratteri (incluso NULL) definite in cfgmgr32.h. È possibile usare questo presupposto per eseguire una query sull'identificatore dell'istanza del dispositivo con codice simile al seguente:

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);
}

in alternativa, se si vuole che il buffer venga ridimensionato in modo dinamico:

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);
        }
    }
}