Pregunta

De acuerdo con la documentación de MSDN, SetupDiGetClassDevs se puede pasar un dispositivo ID de instancia de para obtener un información del dispositivo configurado para un dispositivo específico:

  

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

I obtener el ID de instancia de dispositivo mediante el análisis del nombre simbólico de la WM_DEVICECHANGE mensaje href="http://msdn.microsoft.com/en-us/library/aa363205(VS.85).aspx" rel="noreferrer"> DBT_DEVICEARRIVAL evento , y he verificado la ID resultante comparándola con que regresar de SetupDiGetDeviceInstanceId . Incluso pasar el OS suministrado instancia de dispositivo ID no funciona (es decir, la llamada SetupDiGetClassDevs falla con ERROR_INVALID_PARAMETER).

Mi solución actual para ir a buscar un href="http://msdn.microsoft.com/en-us/library/ms792997.aspx" rel="noreferrer"> SP_DEVINFO_DATA estructura para el recién llegado dispositivo es enumerar todos los dispositivos en la misma clase y comparar el resultado de SetupDiGetDeviceInstanceId al nombre simbólico. Sin embargo, no veo por qué esto debería ser necesario de acuerdo a la documentación ...

¿Alguien SetupDiGetClassDevs para trabajar de esta manera conseguido? ¿Hay un método mejor para conseguir más información para un dispositivo utilizando los datos en caso DBT_DEVICEARRIVAL?

¿Fue útil?

Solución

Parece que tiene que especificar la bandera DIGCF_ALLCLASSES para encontrar todas las clases que coinciden con el ID de instancia de dispositivo determinado, o bien especificar el ClassGuid y el uso de la bandera 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.

Otros consejos

Parece que estás malentendido DBT_DEVICEARRIVAL.

Hay unos pocos tipos diferentes de messages-- DBT_DEVICEARRIVAL para un volumen, por un mango, para una interfaz de dispositivo. Supongo que estamos hablando acerca de la variedad DBT_DEVTYP_DEVICEINTERFACE. En este caso, el campo dbcc_name de la estructura DEV_BROADCAST_DEVICEINTERFACE contendrá el "camino de interfaz de dispositivo".

La "trayectoria de interfaz de dispositivo" no es lo mismo que una "instancia de dispositivo ID".

Si desea conocer más información acerca de este dispositivo, que debe enumerar todos los dispositivos las interfaces 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.

scroll top