Freigeben über


Abrufen der Funktionalen Objektbezeichner für ein Gerät

Wie im Thema Abrufen der von einem Gerät unterstützten Funktionskategorien erwähnt, unterstützen tragbare Windows-Geräte möglicherweise eine oder mehrere Funktionskategorien. Jede bestimmte Funktionskategorie kann ein oder mehrere funktionale Objekte unterstützen. Beispielsweise kann die Speicherkategorie drei funktionale Speicherobjekte unterstützen, von denen jedes durch eine eindeutige Bezeichnerzeichenfolge identifiziert wird. Das erste Speicherobjekt kann dann durch die Zeichenfolge "Storage1", das zweite durch die Zeichenfolge "Storage2" und das dritte durch die Zeichenfolge "Storage3" identifiziert werden.

Die Funktion ListFunctionalObjects im Modul DeviceCapabilities.cpp veranschaulicht den Abruf von Inhaltstypen für die funktionsbezogenen Kategorien, die von einem ausgewählten Gerät unterstützt werden.

Ihre Anwendung kann die von einem Gerät unterstützten Funktionskategorien mithilfe der in der folgenden Tabelle beschriebenen Schnittstellen abrufen.

Schnittstelle Beschreibung
IPortableDeviceCapabilities-Schnittstelle Ermöglicht den Zugriff auf die Funktionsgruppenabrufmethoden.
IPortableDevicePropVariantCollection-Schnittstelle Wird zum Aufzählen und Speichern von Funktionskategoriedaten verwendet.

 

Der Code in der ListFunctionalObjects-Funktion ist fast identisch mit dem Code in der ListFunctionalCategories-Funktion. (Weitere Informationen finden Sie im Thema Abrufen von Funktionskategorien, die von einem Gerät unterstützt werden .) Der einzige Unterschied ist der Aufruf der IPortableDeviceCapabilities::GetFunctionalObjects-Methode , die in der Schleife angezeigt wird, die die Funktionskategorien durchläuft.

HRESULT hr = S_OK;
CComPtr<IPortableDeviceCapabilities>            pCapabilities;
CComPtr<IPortableDevicePropVariantCollection>   pCategories;
DWORD dwNumCategories = 0;

if (pDevice == NULL)
{
    printf("! A NULL IPortableDevice interface pointer was received\n");
    return;
}

// Get an IPortableDeviceCapabilities interface from the IPortableDevice interface to
// access the device capabilities-specific methods.
hr = pDevice->Capabilities(&pCapabilities);
if (FAILED(hr))
{
    printf("! Failed to get IPortableDeviceCapabilities from IPortableDevice, hr = 0x%lx\n",hr);
}

// Get all functional categories supported by the device.
// We will use these categories to enumerate functional objects
// that fall within them.
if (SUCCEEDED(hr))
{
    hr = pCapabilities->GetFunctionalCategories(&pCategories);
    if (FAILED(hr))
    {
        printf("! Failed to get functional categories from the device, hr = 0x%lx\n",hr);
    }
}

// Get the number of functional categories found on the device.
if (SUCCEEDED(hr))
{
    hr = pCategories->GetCount(&dwNumCategories);
    if (FAILED(hr))
    {
        printf("! Failed to get number of functional categories, hr = 0x%lx\n",hr);
    }
}

printf("\n%d Functional Categories Found on the device\n\n", dwNumCategories);

// Loop through each functional category and get the list of
// functional object identifiers associated with a particular
// category.
if (SUCCEEDED(hr))
{
    for (DWORD dwIndex = 0; dwIndex < dwNumCategories; dwIndex++)
    {
        PROPVARIANT pv = {0};
        PropVariantInit(&pv);
        hr = pCategories->GetAt(dwIndex, &pv);
        if (SUCCEEDED(hr))
        {
            // 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))
            {
                // Display the functional category name
                printf("Functional Category: ");
                DisplayFunctionalCategory(*pv.puuid);
                printf("\n");

                // Display the object identifiers for all
                // functional objects within this category
                CComPtr<IPortableDevicePropVariantCollection> pFunctionalObjectIds;
                hr = pCapabilities->GetFunctionalObjects(*pv.puuid, &pFunctionalObjectIds);
                if (SUCCEEDED(hr))
                {
                    printf("Functional Objects: ");
                    DisplayFunctionalObjectIDs(pFunctionalObjectIds);
                    printf("\n\n");
                }
                else
                {
                    printf("! Failed to get functional objects, hr = 0x%lx\n", hr);
                }
            }
            else
            {
                printf("! Invalid functional category found\n");
            }
        }

        PropVariantClear(&pv);
    }
}

IPortableDevice-Schnittstelle

IPortableDeviceCapabilities-Schnittstelle

IPortableDevicePropVariantCollection-Schnittstelle

Programmierhandbuch