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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top