ObjectControl
COM公式ドキュメント
このインターフェイスをコンポーネントに実装すると、COM+ ランタイム環境が適切なタイミングで、オブジェクトに対してそのメソッドを自動的に呼び出します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
COM+ オブジェクトがアクティブ化されるたびに、コンテキスト固有の初期化を実行できるようにします。(ObjectControl.Activate)
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、E_FAIL、および S_OK を返すことがあります。
解説(Remarks)
クライアントがまだアクティブ化されていない COM+ オブジェクトを呼び出すと、COM+ ランタイム環境がそのオブジェクトを自動的にアクティブ化します。これは Just-in-Time Activation と呼ばれます。ObjectControl をインターフェイスとしてサポートするコンポーネントの場合、COM+ はクライアントのメソッド呼び出しをオブジェクトに渡す前に、オブジェクトの Activate メソッドを呼び出します。
コンテキスト固有の初期化処理は、ObjectControl を公開するオブジェクトの Activate メソッドに実装する必要があります。
たとえば、Activate メソッドを使用して、オブジェクトのコンテキストへの参照を取得し、メンバー変数に格納できます。こうすると、オブジェクトコンテキストはそれを必要とする任意のメソッドから利用可能になり、使用するたびに新しく取得する必要がなくなります。オブジェクトのコンテキストへの参照を取得した後は、ObjectContext のメソッドを使用して、セキュリティが有効かどうか、オブジェクトがトランザクション内で実行されているかどうか、または呼び出し元が特定のロールに属しているかどうかを確認できます。
オブジェクトのリサイクルを有効にする場合(オブジェクトに問い合わせる CanBePooled メソッドを実装する場合)、Activate メソッドは新規作成されたオブジェクトとリサイクルされたオブジェクトの両方を扱えなければなりません。Activate メソッドが返るときには、新しいオブジェクトとリサイクルされたオブジェクトとの間に区別できる違いがあってはなりません。
COM+ は、Activate メソッドを呼び出す前(コンストラクター内にある間)に、ObjectControl を公開するオブジェクトを呼び出すことを明示的に禁止しています。そのような呼び出しは RPC_E_DISCONNECTED エラーになります。たとえば、オブジェクトがコンストラクター内で自身への参照を渡し、その参照が Activate の呼び出しより前にそのオブジェクトを呼び戻すと、切断エラーが返されます。
COM+ オブジェクトが、リサイクルまたは破棄される前に必要なクリーンアップを実行できるようにします。
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、E_FAIL、および S_OK を返すことがあります。
解説(Remarks)
COM+ ランタイム環境は、ObjectControl インターフェイスをサポートするオブジェクトが非アクティブ化されるたびに、Deactivate メソッドを呼び出します。オブジェクトは、SetComplete または SetAbort を呼び出したメソッドから戻ったとき、実行されていたトランザクションがコミットまたはアボートされたとき、あるいはオブジェクトへの参照を保持している最後のクライアントがその参照を解放したときに、非アクティブ化されます。
コンポーネントがリサイクルをサポートしている(CanBePooled メソッドから TRUE を返す)場合、Deactivate メソッドを使用して、オブジェクトの状態を Activate メソッドが想定する状態にリセットする必要があります。また、Deactivate メソッドを使用して、オブジェクトのコンテキストを解放したり、その他のコンテキスト固有のクリーンアップを行ったりすることもできます。オブジェクトがリサイクルをサポートしている場合でも、再利用可能な特定のリソースを Deactivate メソッドで解放することは有益な場合があります。たとえば、ODBC は独自の接続プールを提供します。データベース接続をオブジェクトプール内の特定のオブジェクトに結び付けたままにするよりも、他のオブジェクトが使用できる汎用の接続プールでプールする方が効率的です。
COM+ は、Deactivate メソッドが返った後(デストラクター内にある間)に、ObjectControl を公開するオブジェクトを呼び出すことを明示的に禁止しています。そのような呼び出しは RPC_E_DISCONNECTED エラーになります。たとえば、オブジェクトが自身への参照を渡し、その後 Deactivate が返った後にそのオブジェクトを呼び戻すと、切断エラーが発生します。
オブジェクトが非アクティブ化されるときに、再利用のためにプールできるかどうかを示します。
| pbPoolable | VARIANT_BOOL* | inout | COM+ ランタイム環境が、後で再利用するために、非アクティブ化時にこのオブジェクトをプールできるかどうかを示します。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、E_FAIL、および S_OK を返すことがあります。
解説(Remarks)
オブジェクトが CanBePooled から TRUE を返すと、COM+ ランタイム環境に対して、非アクティブ化後に破棄されるのではなくオブジェクトプールに追加できることを示します。インスタンスが必要になるたびに、新しく作成されるのではなくプールから取り出されます。
CanBePooled から TRUE を返しても、オブジェクトがリサイクルされることは保証されません。COM+ ランタイム環境にリサイクルの許可を与えるだけです。CanBePooled メソッドから FALSE を返すと、コンポーネントのインスタンスがリサイクルされないことが保証されます。
Activate メソッドは、新しいインスタンスが作成された場合、またはリサイクルされたインスタンスがプールから取り出された場合に呼び出されます。同様に、Deactivate メソッドは、オブジェクトが破棄される場合でもリサイクルのためにプールに返される場合でも、非アクティブ化されるたびに呼び出されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ObjectControl "{7DC41850-0C31-11D0-8B79-00AA00B8A790}" #usecom global ObjectControl IID_ObjectControl "{}" #comfunc global ObjectControl_Activate 3 #comfunc global ObjectControl_Deactivate 4 #comfunc global ObjectControl_CanBePooled 5 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_ObjectControl "{7DC41850-0C31-11D0-8B79-00AA00B8A790}" #usecom global ObjectControl IID_ObjectControl "{}" #comfunc global ObjectControl_Activate 3 #comfunc global ObjectControl_Deactivate 4 #comfunc global ObjectControl_CanBePooled 5 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。