Compartilhar via


Recuperando formatos de serviço com suporte

O aplicativo WpdServicesApiSample inclui código que demonstra como um aplicativo pode recuperar os formatos compatíveis com determinado serviço Contacts chamando métodos das interfaces na tabela a seguir.

Interface Descrição
IPortableDeviceService Usado para recuperar a interface IPortableDeviceServiceCapabilities para acessar os eventos com suporte.
IPortableDeviceServiceCapabilities Fornece acesso aos eventos e atributos de evento com suporte.
IPortableDevicePropVariantCollection Contém a lista de formatos com suporte.
IPortableDeviceValues Contém os atributos de um determinado formato.

 

Quando o usuário escolhe a opção "3" na linha de comando, o aplicativo invoca o método ListSupportedFormats encontrado no módulo ServiceCapabilities.cpp.

Observe que, antes de recuperar a lista de eventos, o aplicativo de exemplo abre um serviço contatos em um dispositivo conectado.

No WPD, um formato é descrito por atributos que especificam o nome e (opcionalmente) o tipo MIME de um determinado formato. Esses atributos são definidos no arquivo de cabeçalhoPortableDevice.h. Para obter uma descrição dos atributos com suporte, consulte o tópico Atributos .

No caso do aplicativo de exemplo, se o WpdServiceSampleDriver for o único dispositivo instalado, o driver retornará dois formatos com suporte para seu serviço de contato: "AbstractContactFormat" e "VCard2Format". Esses formatos correspondem à WPD_OBJECT_FORMAT_ABSTRACT_CONTACT e aos atributos WPD_OBJECT_FORMAT_VCARD2 encontrados em PortableDevice.h.

Dois métodos no módulo ServiceCapabilities.cpp dão suporte à recuperação de formatos com suporte para o serviço Contatos: ListSupportedFormats e DisplayFormat. O primeiro recupera o identificador GUID para cada formato com suporte. Este último converte esse GUID em uma cadeia de caracteres amigável.

O método ListSupportedFormats invoca o método IPortableDeviceService::Capabilities para recuperar uma interface IPortableDeviceServiceCapabilities . Usando essa interface, ela recupera os formatos com suporte chamando o método IPortableDeviceServiceCapabilities::GetSupportedFormats . O método GetSupportedFormats recupera o GUID para cada formato com suporte pelo serviço e copia esse GUID em um objeto IPortableDevicePropVariantCollection .

O código a seguir usa o método ListSupportedFormats .

// List all supported formats on the service
void ListSupportedFormats(
    IPortableDeviceService* pService)
{
    HRESULT hr              = S_OK;
    DWORD   dwNumFormats    = 0;
    CComPtr<IPortableDeviceServiceCapabilities>     pCapabilities;
    CComPtr<IPortableDevicePropVariantCollection>   pFormats;

    if (pService == NULL)
    {
        printf("! A NULL IPortableDeviceService interface pointer was received\n");
        return;
    }

    // Get an IPortableDeviceServiceCapabilities interface from the IPortableDeviceService interface to
    // access the service capabilities-specific methods.
    hr = pService->Capabilities(&pCapabilities);
    if (FAILED(hr))
    {
        printf("! Failed to get IPortableDeviceServiceCapabilities from IPortableDeviceService, hr = 0x%lx\n",hr);
    }

    // Get all formats supported by the service.
    if (SUCCEEDED(hr))
    {
        hr = pCapabilities->GetSupportedFormats(&pFormats);
        if (FAILED(hr))
        {
            printf("! Failed to get supported formats from the service, hr = 0x%lx\n",hr);
        }
    }

    // Get the number of supported formats found on the service.
    if (SUCCEEDED(hr))
    {
        hr = pFormats->GetCount(&dwNumFormats);
        if (FAILED(hr))
        {
            printf("! Failed to get number of supported formats, hr = 0x%lx\n",hr);
        }
    }

    printf("\n%d Supported Formats Found on the service\n\n", dwNumFormats);

    // Loop through each format and display it
    if (SUCCEEDED(hr))
    {
        for (DWORD dwIndex = 0; dwIndex < dwNumFormats; dwIndex++)
        {
            PROPVARIANT pv = {0};
            PropVariantInit(&pv);
            hr = pFormats->GetAt(dwIndex, &pv);

            if (SUCCEEDED(hr))
            {
                // We have a format.  It is assumed that
                // formats are returned as VT_CLSID VarTypes.
                if (pv.puuid != NULL)
                {
                    DisplayFormat(pCapabilities, *pv.puuid);
                    printf("\n");
                }
            }

            PropVariantClear(&pv);
        }
    }
}

Depois que o método ListSupportedFormats recuperar o GUID para cada formato com suporte pelo serviço fornecido, ele invocará o método DisplayFormat para exibir o nome amigável do script para cada formato; por exemplo, "VCard2".

O método DisplayFormat invoca o método IPortableDeviceServiceCapabilities::GetFormatAttributes para recuperar uma coleção de atributos para o GUID de formato fornecido. Em seguida, ele chama o método IPortableDeviceValues::GetStringValue e solicita que o driver retorne um nome amigável ao script para o formato fornecido.

O código a seguir usa o método DisplayFormat .

// Display basic information about a format
void DisplayFormat(
    IPortableDeviceServiceCapabilities* pCapabilities,
    REFGUID                             Format)
{
    CComPtr<IPortableDeviceValues> pAttributes;

    HRESULT hr = pCapabilities->GetFormatAttributes(Format, &pAttributes);

    if (SUCCEEDED(hr))
    {
        PWSTR pszFormatName = NULL;
        hr = pAttributes->GetStringValue(WPD_FORMAT_ATTRIBUTE_NAME, &pszFormatName);

        // Display the name of the format if it is available, otherwise fall back to displaying the GUID.
        if (SUCCEEDED(hr))
        {
            printf("%ws", pszFormatName);
        }
        else
        {
            printf("%ws", (PWSTR)CGuidToString(Format));
        }       

        CoTaskMemFree(pszFormatName);
        pszFormatName = NULL;
    }
}

IPortableDeviceService

IPortableDeviceServiceCapabilities

IPortableDeviceValues

WpdServicesApiSample