Partilhar via


Recuperando propriedades do objeto WPD

Os serviços geralmente contêm objetos subordinados que pertencem a um dos formatos suportados por cada serviço. Por exemplo, um serviço Contatos pode oferecer 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 e-mail e assim por diante).

O aplicativo WpdServiceApiSample inclui código que demonstra como um aplicativo pode recuperar as propriedades do objeto de conteúdo suportadas por um determinado serviço Contatos. Este exemplo usa as seguintes interfaces.

Interface Descrição
IPortableDeviceService Recupera a interface IPortableDeviceContent2 para aceder aos métodos dos serviços suportados.
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 para um determinado método.

 

Quando o usuário escolhe a opção "7" na linha de comando, o aplicativo invoca o ReadContentProperties método 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 Serviços de dispositivo PROPERTYKEY Equivalente de WPD_PROPERTYKEY
Identificador de objeto pai Uma cadeia de caracteres que especifica o identificador para o pai de determinado objeto. 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 único persistente Uma cadeia de caracteres que especifica um identificador exclusivo para determinado objeto. Esse identificador é persistente entre sessões, ao contrário do identificador de objeto. Para serviços, isso precisa ser uma representação de sequência de caracteres de um GUID. PKEY_GenericObj_PersistentUID WPD_OBJECT_PERSISTENT_UNIQUE_ID
Formato do objeto Um identificador global exclusivo (GUID) que especifica o formato do arquivo correspondente a um determinado objeto PKEY_GenericObj_ObjectFormat WPD_OBJECT_FORMAT

 

  • ID do pai
  • Nome
  • PersistentUID
  • Formato

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

O código a seguir para o método ReadContentProperties demonstra como a aplicação usa a interface IPortableDeviceContent2 para recuperar a interface IPortableDeviceProperties. Ao passar as 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 identifier 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