Поделиться через


Получение типов контента, поддерживаемых устройством

Как отмечалось в теме Получение функциональных категорий, поддерживаемых устройством, переносные устройства Windows могут поддерживать одну или несколько функциональных категорий. Любая из указанных функциональных категорий может поддерживать один или несколько типов контента. Например, категория хранилища может поддерживать типы содержимого папки, звука и изображения.

Описание типов контента, поддерживаемых WPD, см. в разделе WPD_CONTENT_TYPE_ALL.

Функция ListSupportedContentTypes в модуле DeviceCapabilities.cpp демонстрирует получение типов контента для функциональных категорий, поддерживаемых выбранным устройством.

Приложение может получить функциональные категории, поддерживаемые устройством, с помощью интерфейсов, описанных в следующей таблице.

Интерфейс Описание
интерфейс IPortableDeviceCapabilities Предоставляет доступ к методам извлечения функциональных категорий.
интерфейс IPortableDevicePropVariantCollection Используется для перечисления и хранения данных функциональной категории.

 

Код, найденный в функции ListSupportedContentTypes, почти идентичен коду, найденном в функции ListFunctionalCategories. (См. тему получения функциональных категорий, поддерживаемых устройством.) Одно различие заключается в вызове метода IPortableDeviceCapabilities::GetSupportedContentTypes, который находится в цикле, перебирающем функциональные категории.

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 display its name and supported content types.
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 content types supported for this category
                CComPtr<IPortableDevicePropVariantCollection> pContentTypes;
                hr = pCapabilities->GetSupportedContentTypes(*pv.puuid, &pContentTypes);
                if (SUCCEEDED(hr))
                {
                    printf("Supported Content Types: ");
                    DisplayContentTypes(pContentTypes);
                    printf("\n\n");
                }
                else
                {
                    printf("! Failed to get supported content types from the device, hr = 0x%lx\n",hr);
                }
            }
            else
            {
                printf("! Invalid functional category found\n");
            }
        }

        PropVariantClear(&pv);
    }
}

интерфейс IPortableDevice

интерфейс IPortableDeviceCapabilities

интерфейс IPortableDevicePropVariantCollection

Руководство по программированию