Работает ли SetupDiGetClassDevs с идентификаторами экземпляров устройств, как описано в документации?

StackOverflow https://stackoverflow.com/questions/956669

Вопрос

Согласно документации MSDN, НастройкаDiGetClassDevs можно передать идентификатор экземпляра устройства чтобы получить набор информации об устройстве для конкретного устройства:

Чтобы вернуть только определенное устройство, установите флаг DIFCF_DeviceInterface и используйте параметр перечисления, чтобы подать идентификатор экземпляра устройства устройства.

Я получаю идентификатор экземпляра устройства, анализируя символическое имя из WM_DEVICECHANGE сообщение DBT_DEVICEARRIVAL событие, и я проверил полученный идентификатор, сравнив его с возвращенным из Сетупдижетдевицеинстанцеид.Даже передача идентификатора экземпляра устройства, предоставленного ОС, не работает (т.вызов SetupDiGetClassDevs завершается с ошибкой ERROR_INVALID_PARAMETER).

Мой текущий обходной путь для получения SP_DEVINFO_DATA Структура вновь прибывшего устройства заключается в перечислении всех устройств в одном классе и сравнении результата SetupDiGetDeviceInstanceId с символическим именем.Однако я не понимаю, почему это необходимо согласно документации...

Кто-нибудь заставил SetupDiGetClassDevs работать таким образом?Есть ли лучший способ получить дополнительную информацию об устройстве, используя данные в событии DBT_DEVICEARRIVAL?

Это было полезно?

Решение

Кажется, вам нужно либо указать DIGCF_ALLCLASSES флаг, чтобы найти все классы, соответствующие данному идентификатору экземпляра устройства, или же укажите 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 Структура будет содержать «путь к интерфейсу устройства».

«Путь к интерфейсу устройства» НЕ совпадает с «идентификатором экземпляра устройства».

Если вы хотите узнать больше информации об этом устройстве, вам следует перечислить все устройства интерфейсы по этому GUID интерфейса устройства (через SetupDiGetClassDevs с DIGCF_DEVICEINTERFACE) и сравните dbcc_name со строками, полученными SetupDiEnumDeviceInterfaces.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top