Frage

Nach MSDN-Dokumentation, SetupDiGetClassDevs kann ein Gerät Instanz-ID ein Geräteinformationen gesetzt für ein bestimmtes Gerät:

  

Um nur ein bestimmtes Gerät zurückgeben, setzen   die DIFCF_DEVICEINTERFACE Flag und Verwendung   die Enumerator Parameter liefern die   Gerät Instanz-ID des Geräts.

ich das Gerät Instanz-ID erhalten, indem Sie den symbolischen Namen aus der DBT_DEVICEARRIVAL Veranstaltung , und ich habe die resultierende ID verifiziert, indem sie es zu, dass kehrte von SetupDiGetDeviceInstanceId . Auch die mitgelieferte OS-Gerät Instanz zu übergeben ID nicht funktioniert (das heißt der SetupDiGetClassDevs Aufruf fehlschlägt mit ERROR_INVALID_PARAMETER).

Meine aktuelle Problemumgehung holen eine SP_DEVINFO_DATA Struktur für die neu ankam Gerät ist für alle Geräte in der gleichen Klasse aufzuzählen und das Ergebnis der SetupDiGetDeviceInstanceId zu dem symbolischen Namen zu vergleichen. Aber ich sehe nicht, warum dies erforderlich sein sollte entsprechend die Dokumentation ...

Hat jemand SetupDiGetClassDevs bekommen auf diese Weise zu arbeiten? Gibt es eine bessere Methode für das Erhalten weiterer Informationen für eine Gerätedaten im DBT_DEVICEARRIVAL Ereignis mit?

War es hilfreich?

Lösung

Es scheint, Sie müssen entweder die DIGCF_ALLCLASSES Flag angeben, um alle Klassen zu finden, die die angegebene Geräteinstanz-ID übereinstimmen, oder auch die ClassGUID angeben und die DIGCF_DEFAULT Flags verwenden.

Das funktioniert für mich:

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

Mit Ausgabe:

Match
103: No more data is available.

Andere Tipps

Es scheint, dass Sie DBT_DEVICEARRIVAL sind Missverständnis.

Es gibt ein paar verschiedene Arten von DBT_DEVICEARRIVAL messages-- für ein Volumen, für einen Griff, für eine Geräteschnittstelle. Ich vermute, Sie sprechen über die DBT_DEVTYP_DEVICEINTERFACE Vielfalt. In diesem Fall wird das dbcc_name Feld der DEV_BROADCAST_DEVICEINTERFACE Struktur enthält den „Device-Schnittstelle Pfad“.

Der "Device-Schnittstelle Pfad" ist nicht das gleiche wie eine "Gerät Instanz-ID".

Wenn Sie weitere Informationen zu diesem Gerät wissen wollen, sollten Sie alle Geräte aufzuzählen Schnittstellen von diesem Gerät Schnittstelle GUID (durch SetupDiGetClassDevs mit DIGCF_DEVICEINTERFACE) und vergleichen Sie die dbcc_name den von SetupDiEnumDeviceInterfaces abgerufen Strings.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top