Invocando métodos de serviço
O aplicativo WpdServicesApiSample inclui código que demonstra como um aplicativo pode invocar os métodos compatíveis com um determinado serviço Contatos de forma síncrona.. Este exemplo usa as interfaces a seguir
Interface | Descrição |
---|---|
IPortableDeviceService | Usado para recuperar a interface IPortableDeviceServiceMethods para invocar métodos em um determinado serviço. |
IPortableDeviceServiceMethods | Usado para invocar um método de serviço. |
IPortableDeviceValues | Usado para manter os parâmetros de método de saída e os resultados do método de entrada. Isso poderá ser NULL se o método não exigir parâmetros ou retornar resultados. |
Quando o usuário escolhe a opção "9" na linha de comando, o aplicativo invoca o método InvokeMethods encontrado no módulo ServiceMethods.cpp. Observe que, antes de invocar os métodos, o aplicativo de exemplo abre um serviço Contatos em um dispositivo conectado.
Os métodos de serviço encapsulam a funcionalidade que cada serviço define e implementa. Eles são exclusivos para cada tipo de serviço e são representados por um GUID. Por exemplo, o serviço Contatos define um método BeginSync que os aplicativos chamam para preparar o dispositivo para sincronizar objetos Contact e um método EndSync para notificar o dispositivo de que a sincronização foi concluída. Os aplicativos executam um método chamando IPortableDeviceServiceMethods::Invoke.
Os métodos de serviço não devem ser confundidos com comandos WPD. Os comandos WPD fazem parte da DDI (Interface de Driver de Dispositivo) WPD padrão e são o mecanismo de comunicação entre um aplicativo WPD e o driver. Os comandos são predefinidos, agrupados por categorias, por exemplo, WPD_CATEGORY_COMMON e são representados por uma estrutura PROPERTYKEY . Um aplicativo envia comandos para o driver de dispositivo chamando IPortableDeviceService::SendCommand. Para obter mais informações, consulte o tópico Comandos.
O método InvokeMethods invoca o método IPortableDeviceService::Methods para recuperar uma interface IPortableDeviceServiceMethods . Usando essa interface, ela invoca os métodos BeginSync e EndSync chamando o método IPortableDeviceServiceMethods::Invoke . Cada vez que ele chama Invoke, o aplicativo fornece o REFGUID para o método que é invocado.
O código a seguir usa o método InvokeMethods .
// Invoke methods on the Contacts Service.
// BeginSync and EndSync are methods defined by the FullEnumerationSync Device Service.
void InvokeMethods(IPortableDeviceService* pService)
{
HRESULT hr = S_OK;
CComPtr<IPortableDeviceServiceMethods> pMethods;
if (pService == NULL)
{
printf("! A NULL IPortableDeviceService interface pointer was received\n");
return;
}
// Get an IPortableDeviceServiceMethods interface from the IPortableDeviceService interface to
// invoke methods.
hr = pService->Methods(&pMethods);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceServiceMethods from IPortableDeviceService, hr = 0x%lx\n",hr);
}
// Invoke() the BeginSync method
if (SUCCEEDED(hr))
{
// This method does not take any parameters or results, so we pass in NULL
hr = pMethods->Invoke(METHOD_FullEnumSyncSvc_BeginSync, NULL, NULL);
if (SUCCEEDED(hr))
{
printf("%ws called, hr = 0x%lx\n",NAME_FullEnumSyncSvc_BeginSync, hr);
}
else
{
printf("! Failed to invoke %ws, hr = 0x%lx\n",NAME_FullEnumSyncSvc_BeginSync, hr);
}
}
// Invoke the EndSync method asynchronously
if (SUCCEEDED(hr))
{
// This method does not take any parameters or results, so we pass in NULL
hr = pMethods->Invoke(METHOD_FullEnumSyncSvc_EndSync, NULL, NULL);
if (SUCCEEDED(hr))
{
printf("%ws called, hr = 0x%lx\n",NAME_FullEnumSyncSvc_EndSync, hr);
}
else
{
printf("! Failed to invoke %ws, hr = 0x%lx\n",NAME_FullEnumSyncSvc_EndSync, hr);
}
}
}
Tópicos relacionados