문제

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top