Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O aplicativo WpdServicesApiSample inclui código que demonstra como um aplicativo pode recuperar os formatos suportados por um determinado serviço de contatos chamando métodos das interfaces na tabela a seguir.
| Interfaz | Descrição |
|---|---|
| IPortableDeviceService | Usado para recuperar a interface IPortableDeviceServiceCapabilities para aceder aos eventos suportados. |
| IPortableDeviceServiceCapabilities | Fornece acesso aos eventos suportados e atributos de evento. |
| IPortableDevicePropVariantCollection | Contém a lista de formatos suportados. |
| IPortableDeviceValues | Contém os atributos para um determinado formato. |
Quando o usuário escolhe a opção "3" na linha de comando, o aplicativo invoca o ListSupportedFormats método encontrado no módulo ServiceCapabilities.cpp.
Observe que antes de recuperar a lista de eventos, o aplicativo de exemplo abre um serviço de 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çalho PortableDevice.h. Para obter uma descrição dos atributos suportados, consulte o tópico Atributos.
No caso do aplicativo de exemplo, se o WpdServiceSampleDriver for o único dispositivo instalado, o driver retornará dois formatos suportados para seu serviço de contato: "AbstractContactFormat" e "VCard2Format". Esses formatos correspondem aos atributos WPD_OBJECT_FORMAT_ABSTRACT_CONTACT e WPD_OBJECT_FORMAT_VCARD2 encontrados em PortableDevice.h.
Dois métodos no módulo ServiceCapabilities.cpp suportam a recuperação de formatos suportados para o serviço Contactos: ListSupportedFormats e DisplayFormat. O primeiro recupera o identificador GUID para cada formato suportado. 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, ele recupera os formatos suportados chamando o IPortableDeviceServiceCapabilities::GetSupportedFormats método. O GetSupportedFormats método recupera o GUID para cada formato suportado pelo serviço e copia esse GUID em um IPortableDevicePropVariantCollection objeto.
O código a seguir usa o ListSupportedFormats método.
// 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 recupera o GUID para cada formato suportado pelo serviço fornecido, ele invoca 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 determinado. Em seguida, ele chama o IPortableDeviceValues::GetStringValue método e solicita que o driver retorne um nome amigável de script para o formato determinado.
O código a seguir usa o DisplayFormat método.
// 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;
}
}
Tópicos relacionados