windows - Sådan fortæller du digitalkamera fra andre enheder ved hjælp af WPD og bruger Setup API

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har 2 opgaver:


a) skelne digitale kameraer fra andre MTP-enheder, opnået af IPortableDeviceManager :: GetDeviceList;


b) Jeg ønsker at finde tilsluttede digitale kameraer med Setup API. Min tankegang var at få alle USB-enheder først:


SetupDiGetClassDevs( &GUID\_DEVINTERFACE\_USB\_DEVICE, 0, 0, DIGCF\_DEVICEINTERFACE | DIGCF\_PRESENT);


Men efter at jeg har gjort det, har jeg ikke været i ideer. Specielt kan jeg ikke finde ud af, hvordan man henter USB-interface-deskriptorer til en bestemt USB-enhed. Jeg mener USB-grænseflader, ikke hvad der hedder en grænseflade i setup-API.


Tak på forhånd.

Bedste reference


Her er hvordan det er gjort med WPD (forudsat at du har en allerede åbnet enhed ved navn 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);
    }