SetupDiGetClassDevs は、文書に記載されているようにデバイス インスタンス ID で機能しますか?

StackOverflow https://stackoverflow.com/questions/956669

質問

MSDN ドキュメントによると、 SetupDiGetClassDevs 渡すことができます デバイスインスタンスID を得るために デバイス情報セット 特定のデバイスの場合:

特定のデバイスのみを返すには、difcf_deviceinterfaceフラグを設定し、enumeratorパラメーターを使用してデバイスのデバイスインスタンスIDを提供します。

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

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

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

役に立ちましたか?

解決

のどちらかを指定する必要があるようです 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.

他のヒント

どうやら誤解しているようですね DBT_DEVICEARRIVAL.

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top