叫用服務方法

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方法,以叫用BeginSync和EndSync方法。 每次呼叫 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