wie dokumentiert mit Geräteinstanz-IDs Ist SetupDiGetClassDevs arbeiten?
-
12-09-2019 - |
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?
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.