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


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

Службы часто содержат дочерние объекты, принадлежащие одному из форматов, поддерживаемых каждой службой. Например, служба контактов может поддерживать несколько объектов контакта в формате Абстрактный контакт. Каждый объект контакта описывается связанными свойствами (имя контакта, номер телефона, адрес электронной почты и т. д.).

Приложение WpdServiceApiSample содержит код, демонстрирующий, как приложение может получить свойства объекта содержимого, поддерживаемые данной службой контактов. В этом примере используются следующие интерфейсы.

Интерфейс Описание
IPortableDeviceService Извлекает интерфейс IPortableDeviceContent2 для доступа к поддерживаемым методам службы.
IPortableDeviceContent2 Предоставляет доступ к методам, зависящим от содержимого.
IPortableDeviceProperties Извлекает значения свойств объекта.
IPortableDeviceValues Содержит значения свойств, которые были прочитаны для этого объекта.
IPortableDeviceKeyCollection Содержит параметры для заданного метода.

 

Когда пользователь выбирает параметр "7" в командной строке, приложение вызывает метод ReadContentProperties , который находится в модуле ContentProperties.cpp.

Этот метод извлекает следующие четыре свойства для указанного объекта contact.

Свойство Описание Ключ propertykey служб устройств Эквивалентные WPD_PROPERTYKEY
Идентификатор родительского объекта Строка, указывающая идентификатор родительского объекта. PKEY_GenericObj_ParentID WPD_OBJECT_PARENT_ID
Имя объекта Строка, указывающая имя заданного объекта. PKEY_GenericObj_Name WPD_OBJECT_NAME
Постоянный уникальный идентификатор Строка, задающая уникальный идентификатор для заданного объекта. Этот идентификатор сохраняется в разных сеансах, в отличие от идентификатора объекта. Для служб это должно быть строковое представление GUID. PKEY_GenericObj_PersistentUID WPD_OBJECT_PERSISTENT_UNIQUE_ID
Формат объекта Глобальный уникальный идентификатор (GUID), указывающий формат файла, соответствующего заданному объекту. PKEY_GenericObj_ObjectFormat WPD_OBJECT_FORMAT

 

  • Родительский идентификатор
  • Имя
  • PersistentUID
  • Формат

Обратите внимание, что перед получением свойств содержимого пример приложения открывает службу контактов на подключенном устройстве.

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

// Reads properties for the user specified object.
void ReadContentProperties(
    IPortableDeviceService*    pService)
{
    if (pService == NULL)
    {
        printf("! A NULL IPortableDeviceService interface pointer was received\n");
        return;
    }

    HRESULT                               hr              = S_OK;
    WCHAR                                 szSelection[81] = {0};
    CComPtr<IPortableDeviceProperties>    pProperties;
    CComPtr<IPortableDeviceValues>        pObjectProperties;
    CComPtr<IPortableDeviceContent2>      pContent;
    CComPtr<IPortableDeviceKeyCollection> pPropertiesToRead;

    // Prompt user to enter an object identifier on the device to read properties from.
    printf("Enter the identifer of the object you wish to read properties from.\n>");
    hr = StringCbGetsW(szSelection,sizeof(szSelection));
    if (FAILED(hr))
    {
        printf("An invalid object identifier was specified, aborting property reading\n");
    }

    // 1) Get an IPortableDeviceContent2 interface from the IPortableDeviceService interface to
    // access the content-specific methods.
    if (SUCCEEDED(hr))
    {
        hr = pService->Content(&pContent);
        if (FAILED(hr))
        {
            printf("! Failed to get IPortableDeviceContent2 from IPortableDeviceService, hr = 0x%lx\n",hr);
        }
    }

    // 2) Get an IPortableDeviceProperties interface from the IPortableDeviceContent2 interface
    // to access the property-specific methods.
    if (SUCCEEDED(hr))
    {
        hr = pContent->Properties(&pProperties);
        if (FAILED(hr))
        {
            printf("! Failed to get IPortableDeviceProperties from IPortableDeviceContent2, hr = 0x%lx\n",hr);
        }
    }

    // 3) CoCreate an IPortableDeviceKeyCollection interface to hold the property keys
    // we wish to read.
    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(PKEY_GenericObj_ParentID);
            if (FAILED(hrTemp))
            {
                printf("! Failed to add PKEY_GenericObj_ParentID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
            }

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

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

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

        }
    }

    // 5) Call GetValues() passing the collection of specified PROPERTYKEYs.
    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);
        }
    }

    // 6) Display the returned property values to the user
    if (SUCCEEDED(hr))
    {
        DisplayStringProperty(pObjectProperties, PKEY_GenericObj_ParentID,        NAME_GenericObj_ParentID);
        DisplayStringProperty(pObjectProperties, PKEY_GenericObj_Name,            NAME_GenericObj_Name);
        DisplayStringProperty(pObjectProperties, PKEY_GenericObj_PersistentUID,   NAME_GenericObj_PersistentUID);
        DisplayGuidProperty  (pObjectProperties, PKEY_GenericObj_ObjectFormat,    NAME_GenericObj_ObjectFormat);
    }
}

IPortableDeviceContent2

IPortableDeviceProperties

WpdServicesApiSample