【问题标题】:How to tell digital camera from other devices using WPD and using Setup API如何使用 WPD 和 Setup API 将数码相机与其他设备区分开来
【发布时间】:2011-08-29 19:00:23
【问题描述】:

我有 2 个任务:

a) 将数码相机与其他 MTP 设备区分开来,由 IPortableDeviceManager::GetDeviceList 获得;

b) 我想使用 Setup API 查找已连接的数码相机。我的想法是先获取所有 USB 设备:

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

但是在这样做之后,我已经没有想法了。具体来说,我不知道如何获取特定 USB 设备的 USB 接口描述符。我指的是 USB 接口,而不是 setup API 中所谓的接口。

提前致谢。

【问题讨论】:

    标签: windows wpd setupapi


    【解决方案1】:

    这是使用 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);
        }
    

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多