SetupDigetClassDevs는 문서화 된대로 장치 인스턴스 ID와 작동합니까?
-
12-09-2019 - |
문제
MSDN 문서에 따르면 SETUPDIGETCLASSDEVS 통과 할 수 있습니다 장치 인스턴스 ID a 장치 정보 세트 특정 장치의 경우 :
특정 장치 만 반환하려면 difcf_deviceinterface 플래그를 설정하고 열거기 매개 변수를 사용하여 장치의 장치 인스턴스 ID를 제공하십시오.
상징적 이름을 구문 분석하여 장치 인스턴스 ID를 얻습니다. WM_DEVICECHANGE
메시지 DBT_DEVICEARRIVAL
이벤트, 그리고 나는 그것을 반환 한 것과 비교하여 결과 ID를 확인했습니다. SETUPDIGETDEVICEINSTANCEID. OS 제공 장치 인스턴스 ID를 통과하더라도 작동하지 않습니다 (예 : SetupDigetClassDevs 호출이 실패합니다. ERROR_INVALID_PARAMETER
).
현재의 해결 방법을 가져 오기 위해 a SP_DEVINFO_DATA
새로 도착한 장치의 구조는 동일한 클래스의 모든 장치를 열거하고 SetupDigetDeviceInstanceId의 결과를 기호 이름과 비교하는 것입니다. 그러나 문서에 따라 이것이 왜 필요한지 모르겠습니다 ...
이런 식으로 일하기 위해 SetupDigetClassDevs를 얻은 사람이 있습니까? DBT_DEVICEARRIVAL 이벤트에서 데이터를 사용하여 장치에 대한 추가 정보를 얻는 더 좋은 방법이 있습니까?
해결책
당신이 지정 해야하는 것 같습니다 DIGCF_ALLCLASSES
주어진 장치 인스턴스 ID와 일치하는 모든 클래스를 찾거나 ClassGuid를 지정하고 사용하는 플래그 DIGCF_DEFAULT
깃발.
이것은 나를 위해 효과가있었습니다.
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;
}
출력 :
Match
103: No more data is available.
다른 팁
당신이 오해하는 것 같습니다 DBT_DEVICEARRIVAL
.
몇 가지 다른 유형이 있습니다 DBT_DEVICEARRIVAL
메시지- 볼륨, 핸들, 장치 인터페이스의 경우. 나는 당신이 dbt_devtyp_deviceinterface 다양성에 대해 이야기하고 있다고 생각합니다. 이 경우 dbcc_name
의장 DEV_BROADCAST_DEVICEINTERFACE
구조에는 "장치 인터페이스 경로"가 포함됩니다.
"장치 인터페이스 경로"는 "장치 인스턴스 ID"와 같지 않습니다.
이 장치에 대한 자세한 정보를 알고 싶다면 모든 장치를 열거해야합니다. 인터페이스 이 장치에 의해이 장치 인터페이스 guid (digcf_deviceinterface를 사용하여 setupdigetclassdevs를 통해)를 통해 dbcc_name을 검색 한 문자열과 비교합니다. SetupDiEnumDeviceInterfaces
.