4 WebLogic ServerからCOMアプリケーションへの呼出し
注意:
WebLogic Server 12.2.1.4.0でWebLogic jCOMは非推奨になりました。jCOMは、JavaとCOMの統合が必要な中間ソリューションのための移行手段として提供されています。Oracleでは、Microsoftアプリケーションとの推奨される通信方法としてWebサービスおよびRESTを想定しています。このタイプの通信を使用するには、レガシーCOMアプリケーションを.NETに移行することをお薦めします。
この章の内容は以下のとおりです。
ネイティブ・モードの特別な要件
ネイティブ・モードを使用するWLS-to-COMアプリケーションには、特別な要件が2つあります。
-
COMアプリケーションをネイティブ・モードで実行するには、WebLogic ServerがCOMアプリケーション・マシンにインストールされている必要があります。
-
ネイティブ・モードで実行するには、WebLogic ServerがWindowsマシンで動作している必要があります。
WebLogic ServerからCOMアプリケーションを呼び出す主なステップ
この節では、WebLogic ServerからCOMアプリケーションへ呼び出す主なステップを簡単に説明します。詳細については、以降の節で説明します。
COM側
-
COMアプリケーションをコード化します。「COMアプリケーションのコード化」を参照してください
-
com2java
ツールでCOMオブジェクトからJavaクラスを生成します。「com2java GUIツールでのJavaクラスの生成」を参照してください -
WebLogic Server用にクラスをパッケージ化します。「WebLogic Server用のJavaクラスのパッケージ化」を参照してください
-
COMアプリケーションを起動します。「COMアプリケーションの起動」を参照してください
WebLogic Server側
COMアプリケーションの準備
以下の節では、WebLogic Serverがオブジェクトでメソッドを呼び出せるようCOMクライアントを準備する方法について説明します。
com2java GUIツールでのJavaクラスの生成
COMタイプ・ライブラリに対してcom2java
GUIツールを実行すると、COMタイプ・ライブラリ内のクラスとインタフェースに対応するJavaクラス・ファイルの集合が生成されます。
以降で、GUIツールでのJavaクラスの生成を示します。WebLogic jCOMツール全般の詳細は、「jCOMツールの詳細」を参照してください。
-
com2java
GUIツールを実行するには、次のステップに従います。-
WEBLOGIC_HOME
/server/bin
ディレクトリに移動します(または、このディレクトリをCLASSPATHに追加します)。 -
COMマシンでコマンド・シェルを開き、
com2java.exe
ファイルを起動します。> com2java
-
-
一番上のフィールドで適切なタイプ・ライブラリを選択し、「Javaパッケージ」テキスト・ボックスに、生成されたファイルを格納するパッケージの名前を入力します。
com2java
ツールは、特定のタイプ・ライブラリに対して指定した直前のパッケージ名を記憶しています。 -
「プロキシの生成」をクリックして、Javaクラス・ファイルを生成します。
WebLogic Server用のJavaクラスのパッケージ化
COMオブジェクトをEJBから呼び出す場合は、WebLogic Serverが検出できるように、com2java
で生成するクラス・ファイルをEJB .jar
にパッケージ化する必要があります。生成したファイルは、特定のパッケージに格納します。たとえば、Excelタイプ・ライブラリのファイルをすべてexcelというJavaパッケージに格納できます。
EJB .jar
ファイルのパッケージ化の詳細は、Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発のEJBの実装を参照してください。
com2javaにより生成されたJavaクラスの使い方
com2java
ツールは、タイプ・ライブラリ内でCOMクラスを発見するたびにそのCOMクラスにアクセスするためのJavaクラスを生成します。生成されたJavaクラスは、複数のコンストラクタを持ちます:
-
デフォルト・コンストラクタ - 認証なしでローカル・ホスト上にCOMクラスのインスタンスを作成します
-
2番目のコンストラクタ - 認証なしで特定のホスト上にCOMクラスのインスタンスを作成します
-
3番目のコンストラクタ - 特定の認証でローカル・ホスト上にCOMクラスのインスタンスを作成します
-
4番目のコンストラクタ - 特定の認証で特定のホスト上にCOMクラスのインスタンスを作成します
-
最後のコンストラクタ - 戻されたオブジェクト参照(COMクラスのインスタンスを参照することがわかっています)をラップできます
以下にDataLabelProxyクラスから生成されたコンストラクタのサンプルを示します:
public DataLabelProxy() {} public DataLabelProxy(Object obj) throws java.io.IOException { super(obj, DataLabel.IID); } protected DataLabelProxy(Object obj, String iid) throws java.io.IOException { super(obj, iid); } public DataLabelProxy(String CLSID, String host, boolean deferred) throws java.net.UnknownHostException, java.io.IOException{ super(CLSID, DataLabel.IID, host, null); } protected DataLabelProxy(String CLSID, String iid, String host, AuthInfo authInfo) throws java.io.IOException { super(CLSID, iid, host, authInfo); }
COMインタフェースからcom2javaにより生成されたJavaインタフェースの使い方
COMインタフェースのメソッドは、特定のインタフェースを介してオブジェクトの参照を戻すことができます。
たとえば、Excelタイプ・ライブラリ(Excel8.olb
)は、_Application
COMインタフェースを定義し、そのメソッドAdd
はCOM IDLで次のように定義されます。
[id(0x0000023c), propget, helpcontext(0x0001023c)] HRESULT Workbooks([out, retval] Workbooks** RHS);
このメソッドは、Workbooks
COMインタフェースを実装するオブジェクトの参照を返します。Workbooks
インタフェースは_Application
インタフェースと同じタイプ・ライブラリに定義されているので、com2javaツールは作成する_Application
Javaインタフェースに次のメソッドを生成します。
/** * getWorkbooks.
*
* @return return value. An reference to a Workbooks
* @exception java.io.IOException If there are communications problems.
* @exception com.bea.jcom.AutomationException If the remote server throws an exception. */
public Workbooks getWorkbooks () throws java.io.IOException, com.bea.jcom.AutomationException;
It is revealing to look at the implementation of the method in the generated _ApplicationProxy Java class:
/**
* getWorkbooks.
*
* @return return value. An reference to a Workbooks
* @exception java.io.IOException If there are communications
problems.
* @exception com.bea.jcom.AutomationException If the remote
server throws an exception.
*/
public Workbooks getWorkbooks () throws java.io.IOException,
com.bea.jcom.AutomationException{ com.bea.jcom.MarshalStream
marshalStream = newMarshalStream("getWorkbooks");
marshalStream = invoke("getWorkbooks", 52, marshalStream);
Object res = marshalStream.readDISPATCH("return value");
Workbooks returnValue = res == null ? null : new
WorkbooksProxy(res);
checkException(marshalStream,
marshalStream.readERROR("HRESULT"));
return returnValue;
}
この例にもあるように、getWorkbooks
メソッドは生成されたWorkbooksProxy
Javaクラスを内部的に利用します。前述のとおり、com2javaツールは、Workbooks
戻り値型を持つメソッドを生成します。Workbooks
インタフェースは_Application
と同じタイプ・ライブラリに定義されているからです。
Workbooks
インタフェースが異なるタイプ・ライブラリに定義されている場合、WebLogic jCOMは次のコードを生成します。
/**
* getWorkbooks.
*
* @return return value. An reference to a Workbooks
* @exception java.io.IOException If there are communications
problems.
* @exception com.bea.jcom.AutomationException If the remote server
throws an exception.
*/
public Object getWorkbooks () throws java.io.IOException,
com.bea.jcom.AutomationException;
In this case, you would have to explicitly use the generated proxy class to access the returned Workbooks:
Object wbksObj = app.getWorkbooks();
Workbooks workbooks = new WorkbooksProxy(wbObj);