ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     jCOM リファレンス   |   前へ   |   次へ   |   目次   |   索引   |   PDF 版

ネイティブ モード

 

Java-COM ブリッジは、ネットワーク ベースの DCOM をサポートして Java オブジェクトが COM オブジェクトと対話できるようにするだけでなく、代わりの手段としてブリッジを実行するためのネイティブ コード(DLL)も提供します。

Java コードは、ネイティブ モードと DCOM のどちらを使用する場合も変化しません。

注意 : デフォルトによって、WebLogic jCOM は DCOM を使用します。ネイティブ モードは明示的に有効にする必要があります。

以下の節では、次のことを見ていきます。

 


サポートの対象

IDispatch と vtable

ネイティブ モードでは、IDispatch と Custom(vtable)メソッド呼び出しの両方をどちらの方向でも行うことができます。COM インタフェースは、デュアルである必要がありません(IUnknown から直接派生できます)。

インプロセスとアウトオブプロセス

WebLogic jCOM のネイティブ モードは、以下のものサポートします。

すべての JVM

WebLogic jCOM は、任意のプラットフォームで動作する任意の JVM と一緒に使用できます。

Microsoft Transaction Server / COM+

Java オブジェクトを MTS(インプロセス)に適切にロードし、VB ベース クライアントからその MTS 上のメソッドを呼び出すことに成功しました。

Java オブジェクトは標準 IObjectControl COM インタフェース(com2java で生成された通常の Java インタフェースとして認識する)を実装し、MTS は通常のメソッド(activate、canBePooled、など)を呼び出すことができました。

最後に、WebLogic jCOM ランタイムで特殊なフックを使用して、Java オブジェクトから IObjectContext MTS/COM+ インタフェースにアクセスし、いくつかの属性をテストしました。トランザクションで動作するときなどに、正確に検出が行われました。

 


ネイティブ モードでの Java クライアントの実行

Java クライアントがネイティブ モードで COM オブジェクトにアクセスするためには、COM オブジェクトの型ライブラリに対して com2java ツールを実行し、WebLogic jCOM を DCOM モードで使用するときのように Java プロキシを生成します。

JVM を実行する場合、JCOM_NATIVE_MODE プロパティを定義してネイティブ モードを有効にします。
java -DJCOM_NATIVE_MODE JCOMBridge

COM オブジェクトのコンストラクタにホスト名を渡して、リモート COM コンポーネントを作成します。

WebLogic jCOM ランタイムは、最初にフラグを CLSCTX_ALL に設定して CoCreateInstanceEx を試みます。これに失敗した場合、フラグを CLSCTX_SERVER に設定して再試行します。

スレッド モデル

デフォルトでは、WebLogic jCOM ランタイムは COINIT_MULTITHREADED フラグを使用して COM を初期化します。異なるフラグで COM を初期化する場合は、JCOM_COINIT_VALUE プロパティを設定します。次に例を示します。

java -DJCOM_NATIVE_MODE -DJCOM_COINIT_VALUE=2 JCOMBridge

ネイティブ モードを使用して、DLL にホストされている COM コンポーネントと対話しようとしたときに Class Not Registered というメッセージを取得した場合は、JCOM_COINIT_VALUE を上のとおり 2 に設定してください。

WebLogic jCOM ランタイムは、すべての COM オブジェクト参照をグローバル インタフェース テーブル(GIT)という特別な COM テーブルに配置します。Java から COM に呼び出しが行われるたびに、オブジェクト参照が GIT から取得されます。これにより、呼び出しが現在のスレッドから行われるようになります。

ただし、一部の COM オブジェクト参照(MSHTML 内の Frames コレクションなど)は GIT に置かれないため、WebLogic jCOM は直接的なポインタ参照を格納します。この場合、作成するスレッドがそのオブジェクト上で呼び出しを行うようにする必要があります。この状況は非常にまれであり、何が起こったのかを知らせるメッセージが WebLogic jCOM ログに格納されます(ロギングが有効になっている場合)。

 


ネイティブ モードでの COM クライアントの実行(JVM アウトオブプロセス)

この節を読む前に、標準 DCOM Java の例(VB と Java 間のアーリー バインディングとレイト バインディング)を通読(およびできれば実行)してください。

JVM をプロセス外部で実行する(しかし COM クライアントがネイティブ モードを使用して Java オブジェクトにアクセスする)場合、「regjvm」コマンドを使用してネイティブとしてそれを登録する必要があります。regjvm コマンドはさまざまなレジストリ エントリを設定して WebLogic jCOM の COM と Java 間のメカニズムを容易にします。


 

main で、com.bea.jcom.Jvm.register("MyJvm") を呼び出すことによって WebLogic jCOM ランタイムに JVM が呼び出しを受け取る準備ができていることを知らせます。

次に、JVM を起動します。
java -DJCOM_NATIVE_MODE YourMain

これで、VB からレイト バインディングを使用して、JVM にロードできる Java クラスのインスタンスをインスタンス化できます。
Set aHashtable = GetObject("MyJvm:java.util.Hashtable")

「MyJvm」は、JVM を識別する任意の文字列です。

これは、JVM が既に実行されている場合にのみ機能します。regjvm コマンドの追加パラメータは、実行されていない JVM を起動するためのコマンドを指定できます。

JVM を指定したら、標準 WebLogic jCOM 「regtlb」コマンドを使用して Java オブジェクトにアーリー バインド アクセスします(regtlb はパラメータとして型ライブラリの名前と JVM 名を取り、その型ライブラリに定義されているすべての COM オブジェクトをその JVM に存在するものとして登録します)。

また、独自のインスタンシエータ(com.bea.jcom.Jvm.register(...) への追加パラメータ)を JVM に関連付けることによって、COM クライアントの代わりに Java オブジェクトのインスタンス化を制御できます。これはオブジェクト ファクトリの一種で、WebLogic jCOM ドキュメントの標準 COM->EJB サンプルのほとんどで使用されます。

 


ネイティブ モードでの COM クライアントの実行(JVM インプロセス)

このテクニックを使用すると、実際に JVM を COM クライアントのアドレス空間にロードできます。

ここで再び「regjvm」コマンドを使用します。ただし、今度は追加パラメータを指定します。

最も単純な例は、Visual Basic を使用して Java オブジェクトにレイト バインド アクセスすることです。まず、JVM を登録します。Sun の JDK 1.3.1(d:\bea\jdk131 にインストールされている)を使用し、WebLogic jCOM が d:\bea\wlserver6.1\jcom にインストールされており、Java クラスが c:\pure に格納されている場合は、以下のように設定します。


 

JVM 名、CLASSPATH、および JVM bin ディレクトリ パスを指定します。

これで、VB から次のことを行うことができます。
MessageBox GetObject("MyJvm:java.util.Hashtable")

JVM 用のプロパティを指定する場合、regjvm コマンド ラインの最後に name=value(スペースで区切る)という形式で追加します(-Dname=value は使用しないでください)。たとえば、問題が発生した場合、JCOM_LOG_LEVEL=3JCOM_LOG_FILE=c:\temp\jcom.log を「regjvm」コマンドの最後に追加してロギングを有効にします。上で説明したメカニズム(com.bea.jcom.Log.logImmediately(...) の呼び出し)は、Java クラスに実行の機会があった場合にのみ有効です。問題はその前に存在する場合があります。

E_NOMONIKER エラーを取得した場合、WebLogic jCOM Moniker(jintmk.dll)のロギングを有効にし、必要な JVM クラス、WebLogic jCOM ランタイム(jcom.jar)、および必要なクラスを使用できるようにするためのクラスパスを調べてください。

 


サポートされない機能と確認済みの問題

次の機能は、ネイティブ モードでサポートされていないか、またはバグです。これらを重要事項として追加または解決する場合は、BEA にお問い合わせください。

  1. パラメータとしての構造

 

back to top previous page next page