Compartir a través de


Invocación de los métodos de servicio

La aplicación WpdServicesApiSample incluye código que muestra cómo una aplicación puede invocar los métodos admitidos por un servicio contacts determinado de forma sincrónica. En este ejemplo se usan las siguientes interfaces

Interfaz Descripción
IPortableDeviceService Se usa para recuperar la interfaz IPortableDeviceServiceMethods para invocar métodos en un servicio determinado.
IPortableDeviceServiceMethods Se usa para invocar un método de servicio.
IPortableDeviceValues Se usa para contener los parámetros del método saliente y los resultados del método entrante. Esto puede ser NULL si el método no requiere ningún parámetro ni devuelve ningún resultado.

 

Cuando el usuario elige la opción "9" en la línea de comandos, la aplicación invoca el método InvokeMethods que se encuentra en el módulo ServiceMethods.cpp. Tenga en cuenta que antes de invocar los métodos, la aplicación de ejemplo abre un servicio contactos en un dispositivo conectado.

Los métodos de servicio encapsulan la funcionalidad que cada servicio define e implementa. Son únicos para cada tipo de servicio y se representan mediante un GUID. Por ejemplo, el servicio Contactos define un método BeginSync al que las aplicaciones llaman para preparar el dispositivo para sincronizar objetos Contact y un método EndSync para notificar al dispositivo que se ha completado la sincronización. Las aplicaciones ejecutan un método llamando a IPortableDeviceServiceMethods::Invoke.

Los métodos de servicio no deben confundirse con los comandos wpD. Los comandos WPD forman parte de la interfaz de controlador de dispositivo WPD estándar (DDI) y son el mecanismo para la comunicación entre una aplicación WPD y el controlador. Los comandos están predefinidos, agrupados por categorías, por ejemplo, WPD_CATEGORY_COMMON y se representan mediante una estructura PROPERTYKEY . Una aplicación envía comandos al controlador de dispositivo mediante una llamada a IPortableDeviceService::SendCommand. Para obtener más información, vea el tema Comandos.

El método InvokeMethods invoca el método IPortableDeviceService::Methods para recuperar una interfaz IPortableDeviceServiceMethods . Con esta interfaz, invoca los métodos BeginSync y EndSync llamando al método IPortableDeviceServiceMethods::Invoke . Cada vez que llama a Invoke, la aplicación proporciona el REFGUID para el método que se invoca.

El código siguiente usa el 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