高根英哉 コムラッド代表取締役

 設計が完了したら,いよいよ実開発に入ります。コンポーネントの場合,最初に「スケルトン作成」という作業をしなければなりません。コンポーネントの骨格,つまり中身はなくとも,イベント,メソッド,プロパティというコンポーネントの“器”だけを用意する作業です。この作業だけであれば,慣れてしまえば1,2日で完成するでしょう。この時点で,COMであればGUIDなどの作成,JavaBeansであればBeanInfo*のクラスの作成,コンポーネントの名称などを決定します。この作業により,Visual BasicやIIS(Internet Information Service)のスクリプト,JSPなどから自由にそのコンポーネントを呼び出せるようになります。コンポーネント開発のときには,それを呼び出す実験用のプログラムを作成しながら開発することになりますが,このためにもスケルトン作りは有効です。

 スケルトンを作成するためには,Visual C++などの開発ツールに付属するウィザードを利用することになります。ここで例にとっているCOMの場合,最近の傾向としては,環境依存が少なくGUIを持たないCOMコンポーネントの方が開発頻度としては高いため,ATLのウィザードを利用して,GUIDの設定から各種プロパティなどの設計を行うことが一般的です。MFCにも同様のウィザードが用意されています。

 スケルトンが完成すれば,あとはその中の器を満たす,つまり,具体的な処理内容を記述していくのが一般的なコンポーネント開発になります。記述方法は通常のアプリケーション開発とそう大きく変わるものではありません。メモリーや各種サービスの利用方法にしてもアプリケーションの実装と同様です。とはいえ,その性格(コンポーネントとは呼び出される機能の集合体である)ゆえに,実装が異なるいくつかの注意事項が存在するので紹介しておきます。

●コンポーネントはイベント・ドリブン

 まず,コンポーネントにはmain( )メソッドが存在しません。通常のアプリケーションを起動するためには,プログラムにそのプログラム自身を呼び出すメソッドであるmain( )メソッドを記述し,最初に実行しなければなりませんが,コンポーネントの場合,完全にイベントに応じて動作するイベント・ドリブンのプログラム構造が要求されます。つまり,あらかじめ用意されたWindowsイベントの中ですべての処理を実現しなければならないため,main( )のような自分を主体とする呼び出しができないのです。当然,初期化などはそれに相当するイベントが用意されているので,その中で処理しなければなりません。呼ばれる機能の順番も利用する側のアプリケーションによってさまざまであるため,すべての処理がプロパティ,メソッドの中で完結していなければなりません。それぞれの処理の独立性を重んじたプログラム構造が重要なのです。

図1●アプリケーションの場合、同一のアプリケーションを多重に起動しても、プロセスが異なるため、リソースは明確に区別される。そのため、リソースの使用方法で特別な意識は必要はないが、COMの場合、アプリケーションが起動されたプロセス内で多重にCOMが起動される可能性があるため、リソースの使用に注意する必要がある。

●コンポーネントは1つのプロセスで複数起動

 また,コンポーネントは1つのプロセスの中で,複数起動することを意識しなければなりません(図1[拡大表示])。Excelのような通常のアプリケーションであれば,複数起動した場合,そのすべては別プロセスで動作しているため,お互いに干渉しあうことはありません。例えば,一方のExcelでメニュー表示をカスタマイズしても,もう一方のExcelに影響を与えることはありません。この場合,プログラム上,意識して干渉しないように工夫しているわけではなく,プロセスの違いにより,OSが自動的に影響を与えないように制御しているのです。

 しかし,コンポーネントは1つのアプリケーションから複数呼び出されることがあるため,1つのプロセスから複数起動されることになります。そのため,共有で保持するリソースはお互いに干渉しあうことになります。そのため,プログラム上で意識して干渉しない工夫をしなければなりません。例えば,グローバル変数を利用することは問題ありませんが,その利用方法は制限されます。一般的にはこのような共有変数は極力使用しないようにします。さらに,スレッド・セーフ(マルチスレッドを目的にコンポーネントを起動しても,トラブルが起こらないための制御)を考えた場合,これらの制御はさらに複雑化します。

 いずれもコンポーネントの性格上,当たり前の話ですが,この当たり前の話をどれだけ意識できるかによって,再利用可能なコンポーネントが開発できるかどうかが決まります。