デバイス インスタンス識別子の取得

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 でデバイス インスタンス識別子を取得するには、次の例を参照してください。

デバイス インスタンス識別子の文字列は、cfgmgr32.h MAX_DEVICE_ID_LEN で定義されている文字 (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);
        }
    }
}