Appel de méthodes de service
L’application WpdServicesApiSample comprend du code qui montre comment une application peut appeler de façon synchrone les méthodes prises en charge par un service de 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 méthode sortants et les résultats de méthode entrante. La valeur peut être null si la méthode ne requiert pas de paramètres ou ne retourne aucun résultat. |
Quand 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 de contacts sur un appareil connecté.
Les méthodes de service encapsulent les fonctionnalités que chaque service définit et implémente. Elles sont uniques à 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 standard (DDI) 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, la _ catégorie wpd _ commun 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’il 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);
}
}
}