2009-06-05 8 views
8

Secondo la documentazione MSDN, SetupDiGetClassDevs possono essere passati un device instance ID per ottenere un device information set per un dispositivo specifico:SetupDiGetClassDev funziona con gli ID di istanza della periferica come documentati?

per restituire solo un dispositivo specifico, impostare bandiera DIFCF_DEVICEINTERFACE e utilizzare il parametro enumeratore per fornire il ID istanza dispositivo del dispositivo.

ottengo l'ID istanza dispositivo analizzando il nome simbolico dal WM_DEVICECHANGE messaggio DBT_DEVICEARRIVAL evento, e ho verificato l'ID risultante e confrontarlo con quello restituito dal SetupDiGetDeviceInstanceId. Anche il passaggio dell'ID di istanza del dispositivo fornito dal sistema operativo non funziona (ad esempio, la chiamata SetupDiGetClassDevs non riesce con ERROR_INVALID_PARAMETER).

La mia soluzione attuale per recuperare una struttura SP_DEVINFO_DATA per il dispositivo appena arrivato è enumerare tutti i dispositivi nella stessa classe e confrontare il risultato di SetupDiGetDeviceInstanceId con il nome simbolico. Tuttavia, non vedo perché questo dovrebbe essere necessario secondo la documentazione ...

Qualcuno ha ottenuto SetupDiGetClassDevs per funzionare in questo modo? Esiste un metodo migliore per ottenere ulteriori informazioni per un dispositivo che utilizza i dati nell'evento DBT_DEVICEARRIVAL?

risposta

9

Sembra che sia necessario specificare il flag DIGCF_ALLCLASSES per trovare tutte le classi che corrispondono all'id dell'istanza del dispositivo specificato, oppure specificare 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. 
+0

DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES è stata la parte mancante per me. Dalla documentazione MSDN ho capito che era necessario solo DIGCF_DEVICEINTERFACE, ma questo ha fornito l'errore 87 (argomenti non validi). – angularsen

4

Sembra che stai incomprensione DBT_DEVICEARRIVAL.

Esistono alcuni tipi diversi di messaggi DBT_DEVICEARRIVAL-- per un volume, per un handle, per un'interfaccia dispositivo. Suppongo che tu stia parlando della varietà DBT_DEVTYP_DEVICEINTERFACE. In questo caso, il campo dbcc_name della struttura DEV_BROADCAST_DEVICEINTERFACE conterrà il "percorso dell'interfaccia del dispositivo".

Il "percorso di interfaccia del dispositivo" NON è uguale a un "ID di istanza del dispositivo".

Se volete saperne di più informazioni su questo dispositivo, si dovrebbe elencare tutti i dispositivi interfacce di questo GUID interfaccia del dispositivo (tramite SetupDiGetClassDevs con DIGCF_DEVICEINTERFACE), e confrontare il dbcc_name alle corde recuperati dalla SetupDiEnumDeviceInterfaces.