この特集のトップページへ
Chapter 8:プレゼンテーション層の構築

head2.gif8.2.3 ASPからCOMコンポーネントを使う
 ASPでは,スクリプトからCOMコンポーネントを使うことができる。ここでは,COMコンポーネントを使う方法について説明する。

●基本的なCOMコンポーネントの使い方
 COMコンポーネントを使う方法は,Visual BasicでCOMコンポーネントを使うときにCreateObject関数を使って実体化して利用するという方法とよく似ている。ただし,ASPにおいてはCreateObject関数ではなく,ServerオブジェクトのCreateObjectメソッドを用いて,次のような書式で記述する。


<% Set 変数 = _
  Server.CreateObject("プログラムID") %>

 たとえば,Chapter 6で作成したBusiness.Customerコンポーネントを実体化し,変数objBusinessからアクセスできるようにするには,次のようにする。


<% Set objBusiness = _
  Server.CreateObject("Business.Customer") %>

One Point! COMコンポーネントを利用する場合,ASPファイルの実行ユーザー(通常は,IUSR_サーバー名というユーザーである)にCOMコンポーネントの利用権限が与えられていることが前提である。ASPファイルの実行ユーザーについては,「8.3 IISとセキュリティ」にて説明する。

 COMオブジェクトを使い終わったら,COMオブジェクトを保持している変数に対し,次のようにNothingを代入して解放する。

<% Set objBusiness = Nothing %>

 ただし,明示的に解放しなくても,ASPファイルの実行が終了すれば,自動的にCOMオブジェクトは解放される。

 実際には,Server.CreateObjectメソッドではなく,VBScriptに用意されているCreateObject関数を使ってCOMコンポーネントを実体化することもできる。しかし,VBScriptに用意されているCreateObject関数を使うと,(1)COMオブジェクトを解放すべきタイミングをASPが掴めずに適切に解放されないおそれがある,(2)トランザクション処理を利用するときにトランザクションに参加できないおそれがある,という2つの問題がある。そのため,COMコンポーネントを実体化するときには,必ずServer.CreateObjectメソッドを利用するようにしてほしい(トランザクション処理については,「COLUMN トランザクショナルASP」を参照)。

 また,COMコンポーネントを利用する場合,Global.asaファイルにOBJECTエレメントを記述することで,Webアプリケーションが起動するときやセッションが開始されるときに,自動的にCOMコンポーネントを実体化することもできる。その詳細は,IISのオンラインヘルプを参照してほしい。


One Point! Webアプリケーションを起動するときにCOMコンポーネントを実体化し,それをすべてのクライアントで共有して,ずっと使い回すという手法はともかくとして,セッションごとにCOMコンポーネントを実体化し,セッションが有効であるあいだ,ずっと実体化しておくという手法は推奨しない。先に説明したように,セッションはクライアント単位の記録領域である。つまり,100台のクライアントが同時に接続してきたならば,100個のCOMオブジェクトが,1000台のクライアントが同時に接続してきたならば,1000個のCOMオブジェクトが,それぞれ生成されることになる。これでは,サーバー側がリソース不足に陥る危険がある。よって,セッションが有効であるあいだずっと使い続けるのではなく,使う必要があるたびにCOMコンポーネントを実体化したほうがよい。特にCOM+で管理されたCOMコンポーネントを利用する場合には,リソースディスペンサが機能するため,COMコンポーネントの実体化にかかる時間はごくわずかである。よってCOM+で管理されたCOMコンポーネントであれば,使うたびに実体化すると処理が遅くなるというようなパフォーマンス上の問題はない。

 Server.CreateObjectメソッドやOBJECTエレメントを使えば,任意のCOMコンポーネントを実体化し,そのCOMオブジェクトを利用することができる。しかしASPでは,VBScriptやJScriptなど,型情報がないスクリプト言語を使うために,若干の制約がある。すでにChapter 6の「COLUMN ByRef渡しの型」で説明したように,スクリプト言語にはVariant型しかないため,ByRef渡しでかつVariant型以外の型の引数を使うメソッドを呼び出すことはできない。


One Point! より根本的な問題として,IDispatchインタフェースをサポートしないCOMコンポーネントはASPから利用できないという点も挙げられるが,Visual Basicで開発したCOMコンポーネントは,すべてIDispatchインタフェースをサポートするから問題ない。IDispatchインタフェースの有無を考慮する必要があるのは,Visual C++などを使って開発されたCOMコンポーネントを扱うときだけである。

 なお,IIS 5.0には,Webアプリケーションでよく使われると思われるいくつかのCOMコンポーネントが提供されている。これらのCOMコンポーネントをServer.CreateObjectメソッドやOBJECTエレメントで実体化し,利用することもできる。提供されているCOMコンポーネントには,アクセスカウンタ,アクセスログの書き出し,アクセス権のチェックなどがある。詳細は,IISのオンラインヘルプを参照してほしい。

Prev 28/43 Next