2009-06-05 13 views
8

Laut MSDN-Dokumentation kann SetupDiGetClassDevs eine device instance ID geleitet werden, um eine device information set für ein bestimmtes Gerät zu erhalten:Funktioniert SetupDiGetClassDevs mit Geräteinstanz-IDs wie dokumentiert?

Um nur ein bestimmtes Gerät zurückgeben, setzen die DIFCF_DEVICEINTERFACE Flagge und verwenden der Enumerator Parameter die zu liefern Geräteinstanz-ID des Geräts.

ich das Gerät Instanz-ID durch den symbolischen Namen aus dem WM_DEVICECHANGE Nachricht DBT_DEVICEARRIVAL Ereignisse Parsen, und ich habe die resultierende ID verifiziert, indem sie es zu, dass zurück von SetupDiGetDeviceInstanceId vergleichen. Selbst das Übergeben der vom Betriebssystem bereitgestellten Geräteinstanz-ID funktioniert nicht (d. H. Der Aufruf von SetupDiGetClassDevs schlägt mit ERROR_INVALID_PARAMETER fehl).

Meine aktuelle Problemumgehung zum Abrufen einer SP_DEVINFO_DATA Struktur für das neu eintreffende Gerät ist, alle Geräte in der gleichen Klasse aufzuzählen und das Ergebnis von SetupDiGetDeviceInstanceId mit dem symbolischen Namen zu vergleichen. Allerdings sehe ich nicht, warum dies gemäß der Dokumentation erforderlich sein sollte ...

Hat jemand SetupDiGetClassDevs auf diese Weise arbeiten? Gibt es eine bessere Methode, um weitere Informationen für ein Gerät zu erhalten, das Daten im Ereignis DBT_DEVICEARRIVAL verwendet?

Antwort

9

Es scheint, dass Sie entweder das DIGCF_ALLCLASSES-Flag angeben müssen, um alle Klassen zu finden, die der angegebenen Geräteinstanz-ID entsprechen, oder andernfalls die ClassGuid und das DIGCF_DEFAULT-Flag verwenden.

Das ist für mich gearbeitet:

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. 
+0

Die DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES war der fehlende Teil für mich. Aus MSDN-Dokumentation habe ich verstanden, dass nur DIGCF_DEVICEINTERFACE notwendig war, aber das gab Fehler 87 (schlechte Argumente). – angularsen

4

Es scheint, dass Sie DBT_DEVICEARRIVAL sind Missverständnis.

Es gibt ein paar verschiedene Arten von DBT_DEVICEARRIVAL Nachrichten - für ein Volume, für ein Handle, für eine Geräteschnittstelle. Ich schätze, Sie sprechen über die Sorte DBT_DEVTYP_DEVICEINTERFACE. In diesem Fall enthält das Feld dbcc_name der Struktur DEV_BROADCAST_DEVICEINTERFACE den "Geräteschnittstellenpfad".

Der "Geräteschnittstellenpfad" ist NICHT identisch mit einer "Geräteinstanz-ID".

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

Verwandte Themen