![]() |
![]() |
|
|
| |
com2java ツール
WebLogic jCOM の com2java ツールは、型ライブラリから情報を読み込み、その型ライブラリに定義されている COM クラスおよびインタフェースにアクセスするための Java ファイルを生成します。
型ライブラリには、COM クラス、インタフェース、およびその他のコンストラクトが登録されています。通常、これらは Visual C++ や Visual BASIC などの開発ツールによって生成されます。
このため、一部の型ライブラリは簡単に識別可能です。拡張子 olb または tlb で終わるファイルは、確実に型ライブラリです。しかし、少々ややこしいのは、型ライブラリは実行ファイルなどの他のファイルに格納される場合があることです。Visual BASIC は、生成した実行ファイルに型ライブラリを格納します。
以下の節では、次のことを見ていきます。
com2java の使い方
com2java ツールは、WebLogic jCOM のインストール ディレクトリの bin サブディレクトリに存在します。たとえば、WebLogic jCOM を c:\bea\wlserver6.1\jcom にインストールした場合、com2java は c:\bea\wlserver6.1\jcom\bin\com2java.exe に存在します。
以下に説明する GUI インタフェースの他に、com2javacmd ツールによってコマンド ライン インタフェースも提供されています。詳細については、「com2javacmd /?」と入力します。
com2java を起動すると、次のダイアログが表示されます。
型ライブラリの選択
ツールで処理する型ライブラリを選択するには、[Select ...
] ボタンをクリックします。
型ライブラリは、COM コンポーネントを含んでいる実行ファイルや DLL ファイルなどの内部に隠されている場合もあります。
com2java ツールは、以前にオープンしてそのプロキシを生成した型ライブラリのリストを記憶しています。
Java パッケージ名の指定
com2java ツールは、型ライブラリの COM クラスおよびインタフェースに対応する Java ソース ファイルを生成します。生成したファイルは、特定のパッケージに格納できます。たとえば、Excel 型ライブラリのすべてのファイルを excel という Java パッケージに格納できます。
[Java package
] テキスト ボックスに、生成されたファイルを格納するパッケージの名前を入力します。
com2java ツールは、特定の型ライブラリに対して指定した直前のパッケージ名を記憶しています。
オプション
オプション ボタンをクリックすると、com2java 用のオプションを選択するためのダイアログ ボックスが表示されます。これらのオプションは、com2java のセッション間で自動的に保存されます。特定の生成処理でのみオプションが必要な場合、プロキシの生成後にオプションを必ずリセットする必要があります。オプションは以下のとおりです。
[Clash Prefix]
型ライブラリに定義されている COM インタフェースのメソッドが既に Java で使用されているメソッド(getClass() メソッドなど)と衝突する場合、com2java は生成したメソッドの名前の先頭に zz_という文字列(デフォルト)を付けます。
[Lower case method names]
Java メソッド名の命名規則では、メソッド名は小文字で開始しなければなりません。com2java ツールはデフォルトでこの規則を採用し、それに応じてメソッド名を変更します。メソッド名を変更したくない場合は、[Options
] ダイアログ ボックスの [Lowercase method names
] チェックボックスをオフにします。
[Only generate IDispatch]
WebLogic jCOM は、IDispatch および vtable アクセスを使用した COM オブジェクトの呼び出しをサポートしています。このオプションを選択すると、すべての呼び出しは IDispatch インタフェースを使用して行われます。
[Generate retry code on '0x80010001 - Call was rejected by callee']
COM サーバがビジーの場合、このエラーを受け取る場合があります。このオプションを選択すると、このエラーを受け取るたびにコードが再試行します。
[Generate Arrays as Objects]
SAFEARRAY のパラメータは、生成される java.lang.Object 型の対応する Java パラメータを持ちます。これは、Variant の外部の 2 次元配列を Java から COM オブジェクトへ、または COM オブジェクトから受け渡す場合に必要です。
このオプションは、実際に渡されるものを変更しません。それは依然として配列であり、生成された Java インタフェースに存在します。生成されたメソッド プロトタイプで配列型を生成せずに、「Object」を指定します。これは、2D 配列を受け渡すときに役立ちます。COM IDL では、次元の数は SAFEARRAY に対して指定されません。また、「generate arrays as objects」オプションをチェックしなかった場合、WebLogic jCOM は単一要素配列を受け渡したと仮定して対応するプロトタイプを生成します。このオプションを選択し、com2java で String[](たとえば)の代わりに Object を生成することにより、自由に 2D 文字列配列を受け渡すことができます。
[Prompt for names for imported tlbs]
型ライブラリは、別の型ライブラリをインポートする場合があります。インポートされた型ライブラリのプロキシも生成する場合、このオプションを選択するとこれらのプロキシのパッケージ名を指定できます。
[Don't generate dispinterfaces]
このオプションを選択すると、ディスパッチインタフェースとして定義されているインタフェースのプロキシの生成が禁止されます。
[Generate depreciated constructors]
生成されるプロキシには、現在は廃止されているコンストラクタがいくつか含まれます。これらのコンストラクタを 1 つも生成したくない場合は、このオプションを選択します。
[Don't rename methods with same names]
COM クラスで名前の衝突が検出された場合、com2java はそのメソッドの 1 つの名前を自動的に変更します。このオプションを選択すると、名前の自動変更が無効になります。
[Ignore conflicting interfaces]
COM クラスが同名のメソッドを定義する複数のインタフェースを実装する場合、このオプションを選択すると、対応する Java クラスは余計なインタフェースを実装しません。生成される getAsXXX メソッドを使用すれば、これらのインタフェースに依然としてアクセスできます。生成されるコメントを参照してください。
[Generate Java AWT classes]
.Java クラスを GUI クラスとして生成します。ActiveX コントロールを Java フレームに埋め込むために使用します。
プロキシの生成
[Generate Proxies ...] ボタンをクリックすると、com2java ツールによって生成される Java ファイルを格納するディレクトリを選択できます。
ディレクトリを選択すると、com2java は型ライブラリを解析し、対応するファイルを指定したディレクトリに出力します。既にディレクトリに Java ソース ファイルが存在する場合、WebLogic jCOM は警告メッセージを発行し、操作をキャンセルできるようにします。
com2java によって生成されるファイル
com2java ツールは、型ライブラリに含まれる以下の 3 種類のコンストラクトを扱います。
生成された Java ファイルを使用して COM オブジェクトを操作する方法を理解するには、アクセスする COM オブジェクトに関連するドキュメントを参照する必要があります。
たとえば、「com2java」を Excel 型ライブラリに対して実行する場合、生成される Java ファイルは Microsoft Excel COM API に対応しています。このため、Microsoft Excel のプログラミング ドキュメントを参照する必要があります。たとえば、Excel 2000 COM API については下記を参照します。
生成されたファイルを元の API に関連付けるのが難しい場合があります。このような場合は、BEA にお問い合わせください。別の COM クライアント(アーリーバインド VB、VC++ など)から正常に動作するコードを提供していただければ、同じことを Java から実行できるようにします。
列挙値
型ライブラリに列挙値が含まれている場合、WebLogic jCOM はその列挙中の要素ごとの定数定義を含んだ Java インタフェースを生成します。
COM インタフェース
WebLogic jCOM は、2 種類の COM インタフェースを処理します。1 つはディスパッチ インタフェースです。このメソッドには COM IDispatch メカニズムを使用しないとアクセスできません。もう 1 つは「デュアル」インタフェースです。このメソッドは直接呼び出すことができます(vtbl アクセス)。
型ライブラリに定義されているインタフェースごとに、com2java ツールは Java インタフェースと Java クラスの 2 つの Java ファイルを生成します。
生成される Java インタフェースの名前は、COM インタフェースの名前と同じです。たとえば、COM インタフェース名が IMyInterface の場合、com2java ツールは IMyInterface という Java インタフェースを IMyInterface.java ファイルに生成します。
com2java が生成するもう 1 つのファイルは Java クラスです。このファイルには、インタフェースを実装する COM オブジェクトにアクセスするためのコードと、インタフェースを実装する Java クラスのメソッドを COM オブジェクトが呼び出すためのコードが含まれます。生成される Java クラスの名前は、インタフェースの名前に「Proxy」を付加したものです。前項の例では、WebLogic jCOM は IMyInterfaceProxy という Java クラスを IMyInterfaceProxy.java というファイルに生成します。
COM インタフェースのメソッドごとに、WebLogic jCOM は Java インタフェース内に対応するメソッドを生成します。インタフェース内に生成される一部の定数は、生成されるコメントが示すように無視して構いません。それらについて知る必要も、使用する必要もありません。
WebLogic jCOM は、インタフェースとそのメソッドを記述した型ライブラリからコメントを取り出し、それらを生成された javadoc コメントで使用します。
COM クラス
COM クラスは、1 つまたは複数の COM インタフェースを実装します。これは、Java クラスが 1 つまたは複数の Java インタフェースを実装できるのと同じです。
型ライブラリの COM クラスごとに、com2java ツールはその COM クラスと同名の対応する Java クラスを生成します。WebLogic jCOM は、複数のインタフェースを実装するクラスもサポートしています。
WebLogic jCOM が生成する Java クラスを使用すると、対応する COM クラスにアクセスできます。
特殊なケース -- ソース インタフェース(イベント)
COM クラスは、インタフェースをソース インタフェースとして指定できます。このため、そのインタフェースを実装する COM クラスのインスタンスは、そのインタフェースに定義されているイベントをサブスクライブできます。サブスクライブしたオブジェクトに対してインタフェース内のメソッドが呼び出されます。
COM イベントは接続ポイントとソース インタフェースを使用して動作しますが、Java のイベント メカニズムはそれとは異なります。com2java ツールは、COM メカニズムを Java プログラムから完全に隠し、標準 Java テクニックを利用してイベントを提供します。
具体的には、com2java は COM クラスにアクセスするために生成した Java クラスに 2 つのメソッドを追加します。
com2java ツールは、クラスがインタフェースをソース ファイルとして使用していることに気付くと、そのインタフェース用の特殊なコードを生成します。com2java ツールは、Java イベントの命名規則に従って、インタフェースを java.util.EventListener Java インタフェースから派生させます。
もう 1 つの Java イベントの規則は、インタフェースの各メソッドは単一のパラメータを持つ必要があるということです。これは、java.util.EventObject Java クラスから派生したクラスのインスタンスです。
最後の Java イベント関連の規則の 1 つは、アダプタ クラスの使用です。このクラスは、イベント インタフェースを実装し、インタフェースのメソッド用の空のデフォルト実装を提供します。イベントにサブスクライブされるクラスを作成する開発者は、インタフェースのすべてのメソッドを実装する必要がありません(特に大規模なインタフェースを使用するときに面倒になります)。
このため、各イベント インタフェースについて、WebLogic jCOM はアダプタ クラスを生成します。
まとめ - イベント
com2java ツールが型ライブラリ内のインタフェースをイベント インタフェースとして扱うには、そのインタフェースをソース インタフェースとして使用する COM クラスが少なくとも 1 つは型ライブラリに存在しなければなりません。
![]() |
![]() |
![]() |