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


Получение свойств для одного объекта

После того как приложение получает идентификатор объекта (см. раздел "Перечисление содержимого") для данного объекта, он может получить описательные сведения об этом объекте путем вызова методов в интерфейсе IPortableDeviceProperties и интерфейса IPortableDeviceKeyCollection.

Метод IPortableDeviceProperties::GetValues получает список указанных свойств для заданного объекта. (Приложение также может вызвать метод GetValues и указать значение NULL для параметра pKeys, чтобы получить все свойства для данного объекта. Однако производительность этого метода может быть значительно медленнее при получении всех свойств.)

Однако прежде чем приложение вызывает GetValues, необходимо определить свойства, которые требуется получить, задав соответствующие ключи в объекте IPortableDeviceKeyCollection. Приложение определяет интересующие свойства путем вызова метода IPortableDeviceKeyCollection::Add и предоставления значения PROPERTYKEY, определяющего каждое из полученных свойств.

Функция ReadContentProperties в модуле ContentProperties.cpp примера приложения демонстрирует получение пяти свойств для выбранного объекта. В следующей таблице описывается каждое из этих свойств и соответствующее значение REFPROPERTYKEY.

Свойство Описание PROPERTYKEY
Идентификатор родительского объекта Строка, задающая идентификатор родительского объекта данного объекта. WPD_OBJECT_PARENT_ID
Имя объекта Строка, указывающая имя заданного объекта. WPD_OBJECT_NAME
Постоянный уникальный идентификатор Строка, задающая уникальный идентификатор данного объекта. (Этот идентификатор является постоянным в сеансах, в отличие от идентификатора объекта.) WPD_OBJECT_PERSISTENT_UNIQUE_ID
Формат объекта Глобальный уникальный идентификатор (GUID), указывающий формат файла, соответствующего заданному объекту. WPD_OBJECT_FORMAT
Тип контента объекта GUID, указывающий тип содержимого, связанного с заданным объектом. WPD_OBJECT_CONTENT_TYPE

 

В следующем фрагменте функции ReadContentProperties показано, как в примере приложения использовался интерфейс IPortableDeviceKeyCollection и метод IPortableDeviceKeyCollection::Add для идентификации извлекаемых свойств.

hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
                      NULL,
                      CLSCTX_INPROC_SERVER,
                      IID_PPV_ARGS(&pPropertiesToRead));
if (SUCCEEDED(hr))
{
    // 4) Populate the IPortableDeviceKeyCollection with the keys we wish to read.
    // NOTE: We are not handling any special error cases here so we can proceed with
    // adding as many of the target properties as we can.
    if (pPropertiesToRead != NULL)
    {
        HRESULT hrTemp = S_OK;
        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_PARENT_ID);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_PARENT_ID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }

        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_NAME);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_NAME to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }

        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_PERSISTENT_UNIQUE_ID);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_PERSISTENT_UNIQUE_ID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }

        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_FORMAT);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_FORMAT to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }

        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_CONTENT_TYPE);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_CONTENT_TYPE to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }
    }
}

После задания соответствующих ключей пример приложения вызвал метод IPortableDeviceProperties::GetValues , чтобы получить указанные значения для данного объекта.

if (SUCCEEDED(hr))
{
    hr = pProperties->GetValues(szSelection,         // The object whose properties we are reading
                                pPropertiesToRead,   // The properties we want to read
                                &pObjectProperties); // Driver supplied property values for the specified object
    if (FAILED(hr))
    {
        printf("! Failed to get all properties for object '%ws', hr= 0x%lx\n", szSelection, hr);
    }
}

Интерфейс IPortableDevice

Интерфейс IPortableDeviceKeyCollection

Интерфейс IPortableDeviceProperties

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