この特集のトップページへ
Chapter 5:ビジネスロジック層の構築

head2.gif 5.3.3 ジャストインタイムアクティベータとイベント
 ジャストインタイムアクティベータでは,COMオブジェクトのアクティブ化と非アクティブ化によって,頻繁にCOMオブジェクトが実体化されたり破棄されたりすることになる。しかし,COMオブジェクトが実体化されるタイミングとアクティブ化されるタイミング,COMオブジェクトが破棄されるタイミングと非アクティブ化されるタイミングは異なる。

 COMオブジェクトが実体化されるときや破棄されるときに何らかの処理を実行したい場合には,InitializeメソッドとTerminateメソッドを利用すればよいということは,すでに「Chapter 2 Component Object Model」で説明した。InitializeメソッドはCOMオブジェクトが実体化されるときに呼び出されるメソッドであり,Terminateメソッドは破棄されるときに呼び出されるメソッドである。

 COM+では,さらに,アクティブ化されるときに呼び出されるメソッドと,非アクティブ化されるときに呼び出されるメソッドの2つが利用できるようになっている。そのメソッドとは,ActivateメソッドとDeactivateメソッドである。前者はCOMオブジェクトがアクティブ化されるときに呼び出されるメソッドであり,後者は非アクティブ化されるときに呼び出されるメソッドである。

 ActivateメソッドとDeactivateメソッドは,ObjectControlインタフェースに対して備わるメソッドである。そのため,COMコンポーネントにActivateメソッドとDeactivateメソッドを実装するには,次のようにする。

1)COM+ Services Type Libraryの参照

 Visual Basicにおいて,[プロジェクト]メニューの[参照設定]を選択し,[COM+ Services Type Library]を参照設定する(Fig.5-14)。COM+ Services Type Libraryは,COM+にかかわるさまざまなオブジェクトの型(インタフェース),メソッド,プロパティ,定数を定義するタイプライブラリであり,COM+対応のCOMコンポーネントを作る場合には,ほとんど例外なく参照設定が必要となる。

Fig.5-14 COM+ Services Type Libraryの参照
fig5_14.gif

2)ObjectControlインタフェースのインプリメント

 Implementsキーワードを利用することで,自分自身がObjectControlインタフェースを装備していることをVisual Basicに告げる。そのためには,クラスモジュールのファイルの先頭に,次の行を記述しておけばよい。

Implements ObjectControl

3)ActivateメソッドとDeactivateメソッドの実装

 ObjectControlインタフェースのActivateメソッドとDeactivateメソッドを次のように実装する。

Private Sub ObjectControl_Activate()
    ' アクティブ化されたときの処理を書く
End Sub
Private Sub ObjectControl_Deactivate()
    ' 非アクティブ化されたときの処理を書く
End Sub

 アクティブ化されたときの処理や非アクティブ化されたときの処理が不要であれば,Subプロシージャの中身は何も書かなくてもよい。しかし,クラスモジュールのファイルにImplements ObjectControlと記述した場合には,ActivateメソッドやDeactivateメソッドのSubプロシージャ自体を省略することはできない。ActivateメソッドやDeactivateメソッドのSubプロシージャが記述されていないと,コンパイルエラーが発生する。

 さらに,ObjectControlインタフェースには,COMオブジェクトのプーリングが可能かどうかを問い合わせるCanBePooledというメソッドがあるので,これも実装しなければならない。CanBePooledメソッドは,次のように実装する。

Private Function ObjectControl_CanBePooled() As Boolean
    ObjectControl_CanBePooled = True
End Function

 CanBePooledメソッドでTrueを返すと,COMオブジェクトをプーリングできるようになる(COMオブジェクトのプーリングについては,「COLUMN オブジェクトプーリング」を参照)。ただし,プーリング可能なのは,マルチスレッドアパートメントモデル(MTA)もしくはCOM+で新しくサポートされたニュートラルアパートメントモデル(NA)と呼ばれる形式で記述されたCOMコンポーネントだけである。Visual Basicでは,シングルスレッドアパートメントモデル(STA)のCOMコンポーネントしか作ることができないため,COMオブジェクトのプーリング機能は利用できない。よって,CanBePooledメソッドの戻り値は事実上無意味である。

 

 COM+で管理されるCOMオブジェクトの初期化処理をしたい場合には,Initializeメソッドではなく,Activateメソッドを使うようにする。そうすれば,COMオブジェクトが実体化されるときだけではなく,アクティブ化されたとき,すなわち実際にCOMオブジェクトがCOMクライアントから使用されるまえの段階で,正しく初期化処理を実行することができる。終了時の後処理をしたい場合も,同様にTerminateメソッドではなく,Deactivateメソッドを使うようにする。


One Point!COMオブジェクトがアクティブ化されるのは,COMクライアントがCOMオブジェクトを実体化したのちにメソッドを呼び出したりプロパティを参照したりしたときである。よって,COMクライアントがCOMオブジェクトを実体化し,そのままメソッドを呼んだりプロパティを参照したりせずに破棄した場合には,COMオブジェクトがアクティブ化されないため,Activateメソッドは呼び出されない(そして,アクティブ化されないから非アクティブ化状態になることもなく,Deactivateメソッドも呼び出されない)。
prevpg.gif Chapter 5-1 11/23 nextpg.gif