Compartilhar via


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);
        } 
    }
}

IPortableDeviceService

IPortableDeviceServiceMethods

WpdServicesApiSample