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);
}
}
}
相關主題