Partager via


Appel de méthodes de service

L’application WpdServicesApiSample inclut du code qui montre comment une application peut appeler de manière synchrone les méthodes prises en charge par un service Contacts donné. Cet exemple utilise les interfaces suivantes

Interface Description
IPortableDeviceService Utilisé pour récupérer l’interface IPortableDeviceServiceMethods pour appeler des méthodes sur un service donné.
IPortableDeviceServiceMethods Utilisé pour appeler une méthode de service.
IPortableDeviceValues Utilisé pour contenir les paramètres de la méthode sortante et les résultats de la méthode entrante. Cela peut être NULL si la méthode ne nécessite aucun paramètre ou retourne des résultats.

 

Lorsque l’utilisateur choisit l’option « 9 » sur la ligne de commande, l’application appelle la méthode InvokeMethods qui se trouve dans le module ServiceMethods.cpp. Notez qu’avant d’appeler les méthodes, l’exemple d’application ouvre un service Contacts sur un appareil connecté.

Les méthodes de service encapsulent des fonctionnalités que chaque service définit et implémente. Elles sont propres à chaque type de service et sont représentées par un GUID. Par exemple, le service Contacts définit une méthode BeginSync que les applications appellent pour préparer l’appareil à la synchronisation des objets Contact, et une méthode EndSync pour informer l’appareil que la synchronisation est terminée. Les applications exécutent une méthode en appelant IPortableDeviceServiceMethods::Invoke.

Les méthodes de service ne doivent pas être confondues avec les commandes WPD. Les commandes WPD font partie de l’interface de pilote de périphérique WPD (DDI) standard et constituent le mécanisme de communication entre une application WPD et le pilote. Les commandes sont prédéfinies, regroupées par catégories, par exemple, WPD_CATEGORY_COMMON, et sont représentées par une structure PROPERTYKEY . Une application envoie des commandes au pilote de périphérique en appelant IPortableDeviceService::SendCommand. Pour plus d’informations, consultez la rubrique Commandes.

La méthode InvokeMethods appelle la méthode IPortableDeviceService::Methods pour récupérer une interface IPortableDeviceServiceMethods . À l’aide de cette interface, il appelle les méthodes BeginSync et EndSync en appelant la méthode IPortableDeviceServiceMethods::Invoke . Chaque fois qu’elle appelle Invoke, l’application fournit le REFGUID pour la méthode appelée.

Le code suivant utilise la méthode 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