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 eventos suportados por um determinado serviço de contatos chamando métodos nas interfaces a seguir.
| Interface | Descrição |
|---|---|
| IPortableDeviceService | Usado para recuperar a IPortableDeviceServiceCapabilities interface para aceder aos eventos suportados. |
| IPortableDeviceServiceCapabilities | Fornece acesso aos eventos suportados e atributos de evento. |
| IPortableDevicePropVariantCollection | Contém a lista de eventos suportados. |
| IPortableDeviceValues | Contém os atributos para um determinado evento. |
Quando o usuário escolhe a opção "4" na linha de comando, o aplicativo invoca o ListSupportedEvents método que é 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 evento é descrito por seu nome, opções e parâmetros. O nome do evento é uma cadeia de caracteres amigável para script, por exemplo, "MyCustomEvent". As opções de evento indicam se um determinado evento é transmitido para todos os clientes e se esse evento suporta reprodução automática. Os atributos do parâmetro event incluem PROPERTYKEY e VARTYPE de um determinado parâmetro.
Quatro métodos no módulo ServiceCapabilities.cpp suportam a recuperação de eventos suportados para o serviço Contatos fornecido: ListSupportedEvents, DisplayEvent, DisplayEventOptionse DisplayEventParameters. O método ListSupportedEvents recupera uma contagem de eventos suportados e o identificador GUID para cada evento. O método DisplayEvent exibe o nome do evento ou GUID e, em seguida, chama DisplayEventOptions e DisplayEventParameters para exibir os dados relacionados ao evento.
O método ListSupportedEvents invoca o métodoIPortableDeviceService::Capabilities para recuperar uma interfaceIPortableDeviceServiceCapabilities. Usando essa interface, ele recupera os eventos suportados chamando o IPortableDeviceServiceCapabilities::GetSupportedEvents método. O GetSupportedEvents método recupera os GUIDs para cada evento suportado pelo serviço e copia esses GUIDs num IPortableDevicePropVariantCollection objeto.
O código a seguir ilustra a recuperação de eventos de serviço suportados.
// List all supported events on the service
void ListSupportedEvents(
IPortableDeviceService* pService)
{
HRESULT hr = S_OK;
DWORD dwNumEvents = 0;
CComPtr<IPortableDeviceServiceCapabilities> pCapabilities;
CComPtr<IPortableDevicePropVariantCollection> pEvents;
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 events supported by the service.
if (SUCCEEDED(hr))
{
hr = pCapabilities->GetSupportedEvents(&pEvents);
if (FAILED(hr))
{
printf("! Failed to get supported events from the service, hr = 0x%lx\n",hr);
}
}
// Get the number of supported events found on the service.
if (SUCCEEDED(hr))
{
hr = pEvents->GetCount(&dwNumEvents);
if (FAILED(hr))
{
printf("! Failed to get number of supported events, hr = 0x%lx\n",hr);
}
}
printf("\n%d Supported Events Found on the service\n\n", dwNumEvents);
// Loop through each event and display it
if (SUCCEEDED(hr))
{
for (DWORD dwIndex = 0; dwIndex < dwNumEvents; dwIndex++)
{
PROPVARIANT pv = {0};
PropVariantInit(&pv);
hr = pEvents->GetAt(dwIndex, &pv);
if (SUCCEEDED(hr))
{
// We have an event. It is assumed that
// events are returned as VT_CLSID VarTypes.
if (pv.puuid != NULL)
{
DisplayEvent(pCapabilities, *pv.puuid);
printf("\n");
}
}
PropVariantClear(&pv);
}
}
}
Depois que o método ListSupportedEvents recupera os GUIDs que representam cada evento suportado pelo serviço fornecido, ele invoca o método DisplayEvent para recuperar dados específicos do evento. Esses dados incluem o nome do evento, suas opções (difusão ou reprodução automática), GUIDs de parâmetros, tipos de parâmetros e assim por diante.
O método DisplayEvent invoca o método IPortableDeviceServiceCapabilities::GetEventAttributes para recuperar uma coleção de atributos para o evento dado. Em seguida, ele chama o IPortableDeviceValues::GetStringValue método e solicita que o driver retorne um nome amigável para o evento determinado. Em seguida, o DisplayEvent chama o IPortableDeviceValues::GetIPortableDeviceValuesValue para recuperar as opções do evento. Finalmente, DisplayEvent chama o IPortableDeviceValues::GetIPortableDeviceKeyCollectionValue para recuperar a lista de parâmetros de evento. Ele passa os dados retornados por esses métodos para as funções auxiliares DisplayEventOptions e DisplayEventParameters, que rendem as opções e informações de parâmetro para o evento dado.
O código a seguir usa o DisplayEvent método.
// Display basic information about an event
void DisplayEvent(
IPortableDeviceServiceCapabilities* pCapabilities,
REFGUID Event)
{
CComPtr<IPortableDeviceValues> pAttributes;
// Get the event attributes which describe the event
HRESULT hr = pCapabilities->GetEventAttributes(Event, &pAttributes);
if (FAILED(hr))
{
printf("! Failed to get the event attributes, hr = 0x%lx\n",hr);
}
if (SUCCEEDED(hr))
{
PWSTR pszFormatName = NULL;
CComPtr<IPortableDeviceValues> pOptions;
CComPtr<IPortableDeviceKeyCollection> pParameters;
// Display the name of the event if it is available. Otherwise, fall back to displaying the GUID.
hr = pAttributes->GetStringValue(WPD_EVENT_ATTRIBUTE_NAME, &pszFormatName);
if (SUCCEEDED(hr))
{
printf("%ws\n", pszFormatName);
}
else
{
printf("%ws\n", (PWSTR)CGuidToString(Event));
}
// Display the event options
hr = pAttributes->GetIPortableDeviceValuesValue(WPD_EVENT_ATTRIBUTE_OPTIONS, &pOptions);
if (SUCCEEDED(hr))
{
DisplayEventOptions(pOptions);
}
else
{
printf("! Failed to get the event options, hr = 0x%lx\n", hr);
}
// Display the event parameters
hr = pAttributes->GetIPortableDeviceKeyCollectionValue(WPD_EVENT_ATTRIBUTE_PARAMETERS, &pParameters);
if (SUCCEEDED(hr))
{
DisplayEventParameters(pCapabilities, Event, pParameters);
}
else
{
printf("! Failed to get the event parameters, hr = 0x%lx\n", hr);
}
CoTaskMemFree(pszFormatName);
pszFormatName = NULL;
}
}
A função auxiliar DisplayEventOptions recebe um objeto IPortableDeviceValues que contém os dados de opção do evento. Em seguida, ele chama o IPortableDeviceValues::GetBoolValue método para recuperar os dados de opções. Usando esses dados, ele renderiza uma cadeia de caracteres indicando se as opções de transmissão e reprodução automática são suportadas.
// Display the basic event options.
void DisplayEventOptions(
IPortableDeviceValues* pOptions)
{
printf("\tEvent Options:\n");
// Read the WPD_EVENT_OPTION_IS_BROADCAST_EVENT value to see if the event is
// a broadcast event. If the read fails, assume FALSE
BOOL bIsBroadcastEvent = FALSE;
pOptions->GetBoolValue(WPD_EVENT_OPTION_IS_BROADCAST_EVENT, &bIsBroadcastEvent);
printf("\tWPD_EVENT_OPTION_IS_BROADCAST_EVENT = %ws\n",bIsBroadcastEvent ? L"TRUE" : L"FALSE");
}
Tópicos relacionados