Russian Qt Forum

Программирование => Общий => Тема начата: slan от Июнь 29, 2012, 14:41



Название: WinAPI. SetupDiGetDeviceRegistryProperty получить SPDRP_LOCATION_INFORMATION
Отправлено: slan от Июнь 29, 2012, 14:41
Добрый день.
Пытаюсь получить SPDRP_LOCATION_INFORMATION подключенных HID-устройств, но первый же вызов SetupDiGetDeviceRegistryPropertyA с данным параметром приводит к ошибке ERROR_INVALID_DATA. Может что не так делаю?

p.s. ошибка именно с SPDRP_LOCATION_INFORMATION, если например поставить SPDRP_DEVICEDESC, то всё отрабатывается нормально

Код:
_err.clear();


    HDEVINFO hDev; 

    GUID hidGuid;
    HidD_GetHidGuid(&hidGuid);

    hDev = SetupDiGetClassDevs(&hidGuid, NULL, NULL, DIGCF_PRESENT |
                            DIGCF_DEVICEINTERFACE);   

    if(!hDev)
    {
        _err = "Не удалось получить описание устройств класса HID";
        return false;
    }

    bool res = true;
    int i = 0;

    while(res)
    {
        unsigned long dataType, bufferSize, reqSize;
        unsigned char *buffer;

        SP_DEVINFO_DATA deviceInfoData;
        deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

        res = SetupDiEnumDeviceInfo(hDev, i++, &deviceInfoData);

        if(res)
        {
            if(!SetupDiGetDeviceRegistryPropertyA(hDev, &deviceInfoData, SPDRP_LOCATION_INFORMATION,
                                                    &dataType, 0, 0, &reqSize))
            {
                int error = GetLastError();
                if(error != ERROR_INSUFFICIENT_BUFFER)
                {
                    if(error == ERROR_INVALID_DATA)
                        _err = "Свойство недоступно";
                    else
                        _err = "Ошибка SetupDiGetDeviceRegistryProperty";
                    return false;
                }
            }

            bufferSize = reqSize;
            buffer = new unsigned char[bufferSize];

            if(!SetupDiGetDeviceRegistryPropertyA(hDev, &deviceInfoData, SPDRP_LOCATION_INFORMATION,
                                                  &dataType, buffer, bufferSize, &reqSize))
            {
                int error = GetLastError();
                if(error == ERROR_INVALID_DATA)
                    _err = "Свойство недоступно";
                else
                    _err = "Ошибка SetupDiGetDeviceRegistryProperty";
            }

            HidDevice device;
            device._path.assign((const char*)buffer);

            _devList.push_back(device);

            delete [] buffer;
        }

    }

    SetupDiDestroyDeviceInfoList(hDev);