サービス メソッドの呼び出し
WpdServicesApiSample アプリケーションには、アプリケーションが特定の連絡先サービスでサポートされているメソッドを同期的に呼び出す方法を示すコードが含まれています。 このサンプルでは、次のインターフェイスを使用します
インターフェイス | 説明 |
---|---|
IPortableDeviceService | 特定のサービスでメソッドを呼び出すために IPortableDeviceServiceMethods インターフェイスを取得するために使用されます。 |
IPortableDeviceServiceMethods | サービス メソッドを呼び出すために使用されます。 |
IPortableDeviceValues | 送信メソッド パラメーターを保持するために使用され、受信メソッドの結果。 メソッドがパラメーターを必要としない場合や結果を返す場合は 、NULL にすることができます 。 |
ユーザーがコマンド ラインでオプション "9" を選択すると、アプリケーションは ServiceMethods.cpp モジュールにある InvokeMethods メソッドを呼び出します。 メソッドを呼び出す前に、サンプル アプリケーションによって接続されているデバイスで連絡先サービスが開かれることに注意してください。
サービス メソッドは、各サービスが定義して実装する機能をカプセル化します。 これらはサービスの種類ごとに一意であり、GUID で表されます。 たとえば、Contacts サービスは、アプリケーションが Contact オブジェクトを同期するためにデバイスを準備するために呼び出す BeginSync メソッドと、同期が完了したことをデバイスに通知する 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);
}
}
}
関連トピック