Arbeitet SetupDiGetClassDevs mit den IDs der Geräteinstanzen wie dokumentiert?

8

Laut der MSDN-Dokumentation kann SetupDiGetClassDevs an Device-Instanz-ID , um eine Geräteinformationssatz für ein bestimmtes Gerät:

  

Um nur ein bestimmtes Gerät zurückzugeben, legen Sie fest   das DIFCF_DEVICEINTERFACE-Flag und verwenden   der Enumerator-Parameter zur Bereitstellung der   Geräteinstanz-ID des Geräts.

Ich erhalte die Geräteinstanz-ID, indem ich den symbolischen Namen von WM_DEVICECHANGE analysiere. Nachricht DBT_DEVICEARRIVAL Ereignis, und ich habe das überprüft ID, indem Sie sie mit der von SetupDiGetDeviceInstanceId zurückgegebenen ID 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, um eine SP_DEVINFO_DATA Struktur für das neu angekommene Gerät abzurufen Auflisten aller Geräte in derselben Klasse und Vergleichen des Ergebnisses von SetupDiGetDeviceInstanceId mit dem symbolischen Namen. Ich sehe jedoch nicht, warum dies laut Dokumentation erforderlich sein sollte ...

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

    
Judge Maygarden 05.06.2009, 15:55
quelle

2 Antworten

9

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

Das hat für mich funktioniert:

%Vor%

Mit Ausgabe:

%Vor%     
John Weldon 08.06.2009, 17:22
quelle
4

Es scheint, dass Sie DBT_DEVICEARRIVAL falsch verstehen.

Es gibt ein paar verschiedene Arten von DBT_DEVICEARRIVAL messages-- 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 weitere Informationen zu diesem Gerät erhalten möchten, sollten Sie alle Geräte Schnittstellen von dieser GUID der Geräteschnittstelle (über SetupDiGetClassDevs mit DIGCF_DEVICEINTERFACE) auflisten und den dbcc_name mit den von% co_de abgerufenen Strings vergleichen %.

    
Ilya 29.12.2010 13:25
quelle