Est-ce que SetupDiGetClassDevs fonctionnent avec ID d'instance de l'appareil comme documenté?
-
12-09-2019 - |
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?
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
.