ICancelMethodCalls
COM公式ドキュメント
ICancelMethodCalls (objidlbase.h) インターフェイスは、送信中のメソッド呼び出しに対するキャンセル要求を管理し、その呼び出しの現在の状態を監視します。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ICancelMethodCalls::Cancel (objidlbase.h) メソッドは、メソッド呼び出しのキャンセルを要求します。
| ulSeconds | DWORD | in | クライアントがキャンセルを要求した後、サーバーが送信中の呼び出しを完了するまで待機する秒数。 |
戻り値
このメソッドは次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| キャンセル要求が行われました。 | |
|
呼び出しはすでにキャンセルされていました。 |
| 呼び出しを処理しているスレッドで、呼び出しのキャンセルが有効になっていません。 | |
| タイムアウト期間中に呼び出しが完了しました。 |
解説(Remarks)
Cancel メソッドはキャンセル要求を発行するだけです。戻り値が S_OK であっても、呼び出しがキャンセルされたことを意味するわけではなく、呼び出しをキャンセルしようと試みたことを意味するにすぎません。キャンセル要求を受け取ったときのキャンセルオブジェクトの動作は、完全に実装者の裁量に委ねられています。
HRESULT を返すメソッドがキャンセルされた場合、戻り値は RPC_S_CALL_CANCELED になります。
ICancelMethodCalls::TestCancel (objidlbase.h) メソッドは、呼び出しがキャンセルされたかどうかを判定します。
戻り値
呼び出しがキャンセルされた場合、戻り値は RPC_E_CALL_CANCELED です。そうでない場合は RPC_S_CALLPENDING です。
解説(Remarks)
サーバーオブジェクトは TestCancel を呼び出して、呼び出しがキャンセルされたかどうかを判定します。呼び出しがキャンセルされている場合、サーバーは必要なリソースをクリーンアップし、制御をクライアントに返す必要があります。
このメソッドは、クライアントとサーバーの両方から呼び出すことができます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ICancelMethodCalls "{00000029-0000-0000-C000-000000000046}"
#usecom global ICancelMethodCalls IID_ICancelMethodCalls "{}"
#comfunc global ICancelMethodCalls_Cancel 3 int
#comfunc global ICancelMethodCalls_TestCancel 4
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。