2009-06-05 11 views
8

は、MSDNのドキュメントによれば、SetupDiGetClassDevsは、特定のデバイスのためdevice information setを得るためdevice instance IDを渡すことができますSetupDiGetClassDevsは文書化されているようにデバイスインスタンスIDで動作しますか?

のみ特定のデバイスを戻すために、 DIFCF_DEVICEINTERFACEフラグセットと を供給する 列挙パラメータを使用デバイスのデバイスインスタンスID。

私はWM_DEVICECHANGEメッセージDBT_DEVICEARRIVALイベントからのシンボリック名を解析することにより、デバイスインスタンスIDを取得し、私はSetupDiGetDeviceInstanceIdから返されたものと比較することによって結果のIDを確認しました。 OS提供のデバイスインスタンスIDを渡しても機能しません(つまり、SetupDiGetClassDevs呼び出しがERROR_INVALID_PARAMETERで失敗します)。

新しく到着したデバイスのSP_DEVINFO_DATA構造をフェッチするための現在の回避策は、同じクラスのすべてのデバイスを列挙し、SetupDiGetDeviceInstanceIdの結果をシンボリック名と比較することです。しかし、なぜこれがドキュメントに基づいて必要なのか分かりません...

このようにしてSetupDiGetClassDevsを稼働させた人はいますか? DBT_DEVICEARRIVALイベントのデータを使用してデバイスの詳細情報を取得する方法はありますか?

答えて

9

DIGCF_ALLCLASSESフラグを指定して、特定のデバイスインスタンスIDと一致するすべてのクラスを見つけるか、ClassGuidを指定してDIGCF_DEFAULTフラグを使用する必要があるようです。

これが私の仕事:出力付き

void error(DWORD err) 
{ 
    WCHAR buf[0x200]; 
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, 0x200, NULL); 
    wprintf(L"%x: %s\n", err, buf); 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    PCWSTR devinst = L"HID\\VID_413C&PID_2105\\6&22CE0F66&0&0000"; 
    HDEVINFO hinfo = SetupDiGetClassDevs(NULL, devinst, NULL, DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES); 
    if (hinfo == INVALID_HANDLE_VALUE) 
    { 
     error(GetLastError()); 
     return 1; 
    } 

    SP_DEVINFO_DATA dinfo; 
    dinfo.cbSize = sizeof(dinfo); 
    int ix = 0; 
    while (SetupDiEnumDeviceInfo(hinfo, ix++, &dinfo)) 
    { 
     wprintf(L"Match\n"); 
    } 

    error(GetLastError()); 

    SetupDiDestroyDeviceInfoList(hinfo); 
    return 0; 
} 

を:

Match 
103: No more data is available. 
+0

DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSESは私の欠けていた部分でした。 MSDNのドキュメントから、DIGCF_DEVICEINTERFACEのみが必要であると理解しましたが、それはエラー87(不正な引数)を与えました。 – angularsen

4

あなたがDBT_DEVICEARRIVALを誤解しているようです。

DBT_DEVICEARRIVALメッセージには、ボリューム用、ハンドル用、デバイスインターフェイス用など、いくつかの種類があります。私はあなたがDBT_DEVTYP_DEVICEINTERFACEの様々な話をしていると思います。この場合、DEV_BROADCAST_DEVICEINTERFACE構造のdbcc_nameフィールドには、「デバイスインターフェイスパス」が含まれます。

「デバイスインタフェースパス」は、「デバイスインスタンスID」と同じではありません。

あなたは、このデバイスについての詳細をお知りになりたい場合は、あなたがすべてのデバイスに(DIGCF_DEVICEINTERFACEとSetupDiGetClassDevsを介して)このデバイスインターフェイスGUIDによってインターフェースを列挙し、SetupDiEnumDeviceInterfacesによって取得された文字列にdbcc_nameを比較する必要があります。

関連する問題