Freigeben über


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

IPortableDeviceService

IPortableDeviceServiceMethods

WpdServicesApiSample