Does SetupDiGetClassDevs lavorano con ID istanza dispositivo come documentato?
-
12-09-2019 - |
Domanda
Secondo la documentazione MSDN, SetupDiGetClassDevs possono essere passati a dispositivo ID istanza per ottenere un informazioni sul dispositivo impostato per un dispositivo specifico:
Per restituire solo un dispositivo specifico, impostare la bandiera DIFCF_DEVICEINTERFACE e l'uso il parametro enumeratore per l'alimentazione del Dispositivo esempio ID del dispositivo.
I ottenere l'ID istanza del dispositivo analizzando il nome simbolico dal WM_DEVICECHANGE
messaggio DBT_DEVICEARRIVAL
evento , e ho verificato l'ID risultante e confrontarlo con quello restituito da SetupDiGetDeviceInstanceId . Anche passando l'OS dotazione ID istanza del dispositivo non funziona (cioè la chiamata SetupDiGetClassDevs riesce con ERROR_INVALID_PARAMETER
).
La mia soluzione attuale per andare a prendere un SP_DEVINFO_DATA
struttura per i nuovi arrivati dispositivo è enumerare tutti i dispositivi nella stessa classe e confronta il risultato del SetupDiGetDeviceInstanceId al nome simbolico. Tuttavia, non vedo perché questo dovrebbe essere necessario in base alla documentazione ...
Qualcuno ha ottenuto SetupDiGetClassDevs a lavorare in questo modo? Esiste un metodo migliore per ottenere ulteriori informazioni per un dispositivo utilizzando i dati in caso DBT_DEVICEARRIVAL?
Soluzione
Sembra si deve specificare il flag DIGCF_ALLCLASSES
per trovare tutte le classi che corrispondono alla determinata istanza di dispositivo id, oppure specificare il ClassGuid e utilizzare il flag DIGCF_DEFAULT
.
Questo ha funzionato per me:
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;
}
Con uscita:
Match
103: No more data is available.
Altri suggerimenti
Sembra che stai incomprensione DBT_DEVICEARRIVAL
.
Ci sono alcuni tipi differenti di DBT_DEVICEARRIVAL
messages-- per un volume, per una maniglia, per un dispositivo di interfaccia. Sto indovinando si sta parlando la varietà DBT_DEVTYP_DEVICEINTERFACE. In questo caso, il campo dbcc_name
della struttura DEV_BROADCAST_DEVICEINTERFACE
conterrà il "percorso interfaccia periferica".
Il "percorso interfaccia del dispositivo" non è lo stesso di una "istanza dispositivo ID".
Se volete saperne di più informazioni su questo dispositivo, si dovrebbe elencare tutti i dispositivi interfacce di questo dispositivo di interfaccia GUID (attraverso SetupDiGetClassDevs con DIGCF_DEVICEINTERFACE), e confrontare il dbcc_name alle corde recuperati dalla SetupDiEnumDeviceInterfaces
.