Question

Selon la documentation MSDN, SetupDiGetClassDevs peut être passé un dispositif ID d'instance pour obtenir un informations de dispositif défini pour un dispositif spécifique:

  

Pour revenir un périphérique spécifique, définissez   le drapeau et l'utilisation DIFCF_DEVICEINTERFACE   le paramètre énumérateur pour fournir le   Dispositif exemple ID de l'appareil.

Je reçois l'instance de périphérique ID en analysant le nom symbolique de la DBT_DEVICEARRIVAL événement , et je l'ai vérifié l'ID résultant en le comparant à celui retourné de SetupDiGetDeviceInstanceId . Même en passant l'instance de périphérique fourni OS ID ne fonctionne pas (à savoir l'appel SetupDiGetClassDevs échoue avec ERROR_INVALID_PARAMETER).

Ma solution actuelle à chercher un SP_DEVINFO_DATA la structure pour les nouveaux arrivants appareil est d'énumérer tous les appareils de la même classe et comparer le résultat de SetupDiGetDeviceInstanceId au nom symbolique. Cependant, je ne vois pas pourquoi cela devrait être nécessaire en fonction de la documentation ...

Quelqu'un at-il eu SetupDiGetClassDevs de travailler de cette façon? Y at-il une meilleure méthode pour obtenir de plus amples informations pour un appareil à l'aide des données en cas DBT_DEVICEARRIVAL?

Était-ce utile?

La solution

Il semble que vous devez soit spécifier le drapeau DIGCF_ALLCLASSES pour trouver toutes les classes qui correspondent à l'ID d'instance de périphérique donné, ou bien spécifier le ClassGuid et utiliser le drapeau DIGCF_DEFAULT.

Cela a fonctionné pour moi:

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;
}

Avec la sortie:

Match
103: No more data is available.

Autres conseils

Il semble que vous êtes malentendu DBT_DEVICEARRIVAL.

Il y a quelques différents types de DBT_DEVICEARRIVAL messages-- pour un volume, pour une poignée, pour une interface de périphérique. Je devine que vous parlez de la variété DBT_DEVTYP_DEVICEINTERFACE. Dans ce cas, le champ dbcc_name de la structure de DEV_BROADCAST_DEVICEINTERFACE contiendra le « chemin d'interface de périphérique ».

Le « chemin d'interface de l'appareil » est pas la même chose comme un « exemple de dispositif ID ».

Si vous voulez en savoir plus d'informations sur cet appareil, vous devez énumérer tous les périphériques interfaces de ce GUID d'interface périphérique (par SetupDiGetClassDevs avec DIGCF_DEVICEINTERFACE) et comparer les dbcc_name aux chaînes récupérées par SetupDiEnumDeviceInterfaces.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top