2009-06-05 23 views
8

Según la documentación MSDN, SetupDiGetClassDevs se puede pasar un device instance ID para obtener un device information set para un dispositivo específico:¿Funciona SetupDiGetClassDevs con ID de instancia de dispositivo como está documentado?

para devolver sólo un dispositivo específico, establezca la bandera DIFCF_DEVICEINTERFACE y utilizar el parámetro Enumerador para suministrar el ID de instancia del dispositivo del dispositivo.

I obtener el ID de instancia de dispositivo mediante el análisis del nombre simbólico de la WM_DEVICECHANGE mensaje DBT_DEVICEARRIVAL evento, y han verificado la ID resultante comparándola con que regresaron de SetupDiGetDeviceInstanceId. Incluso pasar el Id. De instancia del dispositivo proporcionado por el SO no funciona (es decir, la llamada SetupDiGetClassDevs falla con ERROR_INVALID_PARAMETER).

Mi solución actual para recuperar una estructura SP_DEVINFO_DATA para el dispositivo recién llegado es enumerar todos los dispositivos en la misma clase y comparar el resultado de SetupDiGetDeviceInstanceId con el nombre simbólico. Sin embargo, no veo por qué esto debería ser necesario de acuerdo con la documentación ...

¿Alguien ha hecho que SetupDiGetClassDevs funcione de esta manera? ¿Existe un método mejor para obtener más información para un dispositivo que utiliza datos en el evento DBT_DEVICEARRIVAL?

Respuesta

9

Parece que tiene que especificar el indicador DIGCF_ALLCLASSES para buscar todas las clases que coincidan con el identificador de instancia del dispositivo dado, o bien especifique el ClassGuid y utilice el indicador DIGCF_DEFAULT.

Esto funcionó para mí:

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 salida:

Match 
103: No more data is available. 
+0

DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES era la parte que faltaba para mí. De la documentación de MSDN, entendí que solo DIGCF_DEVICEINTERFACE era necesario, pero eso dio el error 87 (malos argumentos). – angularsen

4

Parece que estás malentendido DBT_DEVICEARRIVAL.

Existen algunos tipos diferentes de mensajes DBT_DEVICEARRIVAL-- para un volumen, un identificador, una interfaz de dispositivo. Supongo que estás hablando de la variedad DBT_DEVTYP_DEVICEINTERFACE. En este caso, el campo dbcc_name de la estructura DEV_BROADCAST_DEVICEINTERFACE contendrá la "ruta de la interfaz del dispositivo".

La "ruta de la interfaz del dispositivo" NO es lo mismo que una "ID de instancia del dispositivo".

Si desea conocer más información acerca de este dispositivo, que debe enumerar todas las interfaces de dispositivo de este GUID interfaz de dispositivo (a través de SetupDiGetClassDevs con DIGCF_DEVICEINTERFACE), y comparar el dbcc_name a las cuerdas recuperados por SetupDiEnumDeviceInterfaces.

Cuestiones relacionadas