Compartilhar via


Recuperando propriedades do objeto WPD

Os serviços geralmente contêm objetos filho que pertencem a um dos formatos que cada serviço dá suporte. Por exemplo, um serviço Contacts pode dar suporte a vários objetos de contato do formato Contato Abstrato. Cada objeto de contato é descrito por propriedades relacionadas (nome do contato, número de telefone, endereço de email e assim por diante).

O aplicativo WpdServiceApiSample inclui código que demonstra como um aplicativo pode recuperar as propriedades de objeto de conteúdo compatíveis com um determinado serviço Contacts. Este exemplo usa as interfaces a seguir.

Interface Descrição
IPortableDeviceService Recupera a interface IPortableDeviceContent2 para acessar os métodos de serviço com suporte.
IPortableDeviceContent2 Fornece acesso aos métodos específicos do conteúdo.
IPortableDeviceProperties Recupera os valores da propriedade do objeto.
IPortableDeviceValues Contém os valores de propriedade que foram lidos para esse objeto.
IPortableDeviceKeyCollection Contém os parâmetros de um determinado método.

 

Quando o usuário escolhe a opção "7" na linha de comando, o aplicativo invoca o método ReadContentProperties que é encontrado no módulo ContentProperties.cpp.

Esse método recupera as quatro propriedades a seguir para o objeto de contato especificado.

Propriedade Descrição Device Services PROPERTYKEY Equivalente WPD_PROPERTYKEY
Identificador de objeto pai Uma cadeia de caracteres que especifica o identificador para o pai do objeto fornecido. PKEY_GenericObj_ParentID WPD_OBJECT_PARENT_ID
Nome do objeto Uma cadeia de caracteres que especifica o nome do objeto fornecido PKEY_GenericObj_Name WPD_OBJECT_NAME
Identificador exclusivo persistente Uma cadeia de caracteres que especifica um identificador exclusivo para o objeto fornecido. Esse identificador é persistente entre as sessões, ao contrário do identificador de objeto. Para serviços, isso precisa ser uma representação de cadeia de caracteres de um GUID. PKEY_GenericObj_PersistentUID WPD_OBJECT_PERSISTENT_UNIQUE_ID
Formato do objeto Um GUID (identificador global exclusivo) que especifica o formato do arquivo correspondente a um determinado objeto PKEY_GenericObj_ObjectFormat WPD_OBJECT_FORMAT

 

  • ID pai
  • Nome
  • PersistentUID
  • Formato

Observe que, antes de recuperar as propriedades de conteúdo, o aplicativo de exemplo abre um serviço contatos em um dispositivo conectado.

O código a seguir para o método ReadContentProperties demonstra como o aplicativo usa a interface IPortableDeviceContent2 para recuperar uma interface IPortableDeviceProperties . Passando o PROPERTYKEYS das propriedades solicitadas para o método IPortableDeviceProperties::GetValues , ReadContentProperties recupera os valores solicitados e os exibe na janela do console.

// 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