Как отличить цифровую камеру от других устройств с помощью WPD и API установки - PullRequest
0 голосов
/ 29 августа 2011

У меня есть 2 задания:

а) отличить цифровые камеры от других MTP-устройств, полученные с помощью IPortableDeviceManager :: GetDeviceList;

b) Я хочу найти подключенные цифровые камеры с помощью API настройки. Я думал, чтобы сначала получить все USB-устройства:

SetupDiGetClassDevs( &GUID_DEVINTERFACE_USB_DEVICE, 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);

Но после этого у меня кончились идеи. В частности, я не могу понять, как получить дескрипторы интерфейса USB для конкретного устройства USB. Я имею в виду интерфейсы USB, а не то, что называется интерфейсом в API настройки.

Заранее спасибо.

1 Ответ

0 голосов
/ 08 сентября 2011

Вот как это делается с WPD (при условии, что у вас уже открыто устройство с именем wpdDev):

    IPortableDeviceCapabilities* pCaps = 0;
    IPortableDevice* pWpdDev = wpdDev.getWpdDev();
    hr = pWpdDev->Capabilities(&pCaps);
    if (hr != S_OK || !pCaps)
    {
        Logger() << "Failed to obtain capabilities for device" << CString::fromUtf16(deviceId).toUtf8().getData();
        continue;
    }
    IPortableDevicePropVariantCollection* pCategories = 0;
    hr = pCaps->GetFunctionalCategories(&pCategories);
    if (hr != S_OK || !pCategories)
    {
        Logger() << "Failed to obtain functional categories for device" << CString::fromUtf16(deviceId).toUtf8().getData();
        continue;
    }
    DWORD numCategories = 0;
    hr = pCategories->GetCount(&numCategories);
    if (hr != S_OK || !numCategories)
    {
        Logger() << "Failed to obtain functional categories for device" << CString::fromUtf16(deviceId).toUtf8().getData();
        continue;
    }
    bool isCamera = wpdDev.vendor() == CANON_VENDOR_ID;
    //Просматриваем все категории и проверяем, может ли устройство выполнять функции камеры
    for (size_t idx = 0; idx < numCategories; ++idx)
    {
        PROPVARIANT pv = {0};
        PropVariantInit(&pv);
        hr = pCategories->GetAt(idx, &pv);
        if (hr == S_OK)
        // We have a functional category.  It is assumed that
        // functional categories are returned as VT_CLSID
        // VarTypes.
            if ((pv.puuid != NULL) && (pv.vt == VT_CLSID))
                if (IsEqualGUID(WPD_FUNCTIONAL_CATEGORY_STILL_IMAGE_CAPTURE, *(pv.puuid)))
                    isCamera = true;
        PropVariantClear(&pv);
    }
...