Aufrufen von Dienstmethoden
Die WpdServicesApiSample-Anwendung enthält Code, der veranschaulicht, wie eine Anwendung die von einem bestimmten Contacts-Dienst unterstützten Methoden synchron aufrufen kann. In diesem Beispiel werden die folgenden Schnittstellen verwendet:
Schnittstelle | BESCHREIBUNG |
---|---|
IPortableDeviceService | Wird verwendet, um die IPortableDeviceServiceMethods-Schnittstelle abzurufen, um Methoden für einen bestimmten Dienst aufzurufen. |
IPortableDeviceServiceMethods | Wird zum Aufrufen einer Dienstmethode verwendet. |
IPortableDeviceValues | Wird verwendet, um die ausgehenden Methodenparameter und die ergebnisse der eingehenden Methode zu speichern. Dies kann NULL sein, wenn die Methode keine Parameter erfordert oder Ergebnisse zurückgibt. |
Wenn der Benutzer die Option "9" an der Befehlszeile wählt, ruft die Anwendung die InvokeMethods-Methode auf, die im Modul ServiceMethods.cpp gefunden wird. Beachten Sie, dass die Beispielanwendung vor dem Aufrufen der Methoden einen Contacts-Dienst auf einem verbundenen Gerät öffnet.
Dienstmethoden kapseln Funktionen, die jeder Dienst definiert und implementiert. Sie sind für jeden Diensttyp eindeutig und werden durch eine GUID dargestellt. Der Contacts-Dienst definiert beispielsweise eine BeginSync-Methode , die Von Anwendungen aufgerufen wird, um das Gerät für die Synchronisierung von Contact-Objekten vorzubereiten, und eine EndSync-Methode , um das Gerät darüber zu informieren, dass die Synchronisierung abgeschlossen wurde. Anwendungen führen eine Methode durch Aufrufen von IPortableDeviceServiceMethods::Invoke aus.
Dienstmethoden sollten nicht mit WPD-Befehlen verwechselt werden. WPD-Befehle sind Teil der STANDARD WPD Device Driver Interface (DDI) und der Mechanismus für die Kommunikation zwischen einer WPD-Anwendung und dem Treiber. Befehle sind vordefiniert, nach Kategorien gruppiert, z. B. WPD_CATEGORY_COMMON, und werden durch eine PROPERTYKEY-Struktur dargestellt. Eine Anwendung sendet Befehle an den Gerätetreiber, indem IPortableDeviceService::SendCommand aufgerufen wird. Weitere Informationen finden Sie im Thema Befehle.
Die InvokeMethods-Methode ruft die IPortableDeviceService::Methods-Methode auf, um eine IPortableDeviceServiceMethods-Schnittstelle abzurufen. Mithilfe dieser Schnittstelle werden die Methoden BeginSync und EndSync aufgerufen, indem die IPortableDeviceServiceMethods::Invoke-Methode aufgerufen wird. Jedes Mal, wenn Invoke aufgerufen wird, stellt die Anwendung die REFGUID für die methode bereit, die aufgerufen wird.
Im folgenden Code wird die InvokeMethods-Methode verwendet.
// 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);
}
}
}
Zugehörige Themen