共用方式為


叫用服務方法

WpdServicesApiSample 應用程式包含程式碼,示範應用程式如何以同步方式叫用指定連絡人服務支援的方法。 此範例使用下列介面

介面 描述
IPortableDeviceService 用來擷取 IPortableDeviceServiceMethods 介面,以叫用指定服務上的方法。
IPortableDeviceServiceMethods 用來叫用服務方法。
IPortableDeviceValues 用來保存傳出方法參數和傳入方法結果。 如果方法不需要任何參數或傳回任何結果,這可以是 Null

 

當使用者在命令列選擇選項 「9」 時,應用程式會叫用 ServiceMethods.cpp 模組中找到的 InvokeMethods 方法。 請注意,在叫用 方法之前,範例應用程式會在連線的裝置上開啟連絡人服務。

服務方法會封裝每個服務所定義和實作的功能。 它們對每種服務類型而言都是唯一的,並以 GUID 表示。 例如,Contacts 服務會定義 BeginSync 方法,讓應用程式呼叫以準備裝置以同步處理 Contact 物件,以及 EndSync 方法,以通知裝置同步處理已完成。 應用程式會呼叫 IPortableDeviceServiceMethods::Invoke來執行方法。

服務方法不應與 WPD 命令混淆。 WPD 命令是標準 WPD 設備磁碟機介面 (DDI) 的一部分,而且是 WPD 應用程式和驅動程式之間通訊的機制。 命令是預先定義的、依類別分組,例如 ,WPD_CATEGORY_COMMON,並以 PROPERTYKEY 結構表示。 應用程式會藉由呼叫 IPortableDeviceService::SendCommand,將命令傳送至設備磁碟機。 如需詳細資訊,請參閱命令主題。

InvokeMethods方法會叫用IPortableDeviceService::Methods方法來擷取IPortableDeviceServiceMethods介面。 使用此介面,它會呼叫IPortableDeviceServiceMethods::Invoke方法,以叫用BeginSyncEndSync方法。 每次呼叫 Invoke時,應用程式都會為叫用的方法提供 REFGUID。

下列程式碼使用 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