このドキュメントでは、次のトピックについて説明します。
「アプリケーションの例」の章では 2 つの例となるアプリケーションについて説明します。
ActiveX ブリッジは、JavaBeans(TM) コンポーネントアーキテクチャー (「Bean」) に基づくコンポーネントを、ActiveX コントロールとして効率的にパッケージすることができます。そのため ActiveX コントロールを ActiveX コンテナ内の機能的なコンポーネントとして使用できます。
この ActiveX ブリッジの実装は、SDK/JRE 1.1 から 1.3.1 までの以前の実装とは互換性がないことに注意してください。この新しいブリッジを使用するには、Bean を再パッケージ化する必要があります。
開発目的用に、この実装は次の OS と ActiveX コンテナをサポートします。
OS: Windows NT、2000、XP。
ActiveX コンテナ: Visual Studio 6.0 (SP3)。
パッケージ化された Bean は、上記のプラットフォームとコンテナだけでなく、すべての Windows プラットフォームと ActiveX コンテナで稼動することに注意してください。
注記 1. パッケージャー (
2. |
packager.exe
を使用して、Bean に対する .dll
を生成します。
packager.exe
の使用方法を次に示します。
|
.dll
には、1 つだけパッケージ化された Bean を含めることができる。したがって、各 Bean に対して、個別の .jar
ファイルが必要。.jar
ファイルがほかの .jar
ファイルまたは .class
ファイルに依存している場合は、CLASSPATH
の設定が必要。<jar file name>
には、.jar
ファイルへのパスを含める必要がある。パスはフルパスまたは相対パス。<bean name>
は、sunw.demo.jelly.JellyBean
のように、Bean の完全指定されたパッケージ名である必要がある。-clsid
オプションが使用されない場合、パッケージ化された Bean CLSID
がランダムに生成される。この -clsid
オプションにより、毎回指定された Bean に対する同様の CLSID
を指定できる。-out
が指定されないかぎり、packager.exe
が実行される同じディレクトリに .dll
を生成する。-out
パラメータを指定する場合、packager
は .dll
ファイルを指定したディレクトリに格納する。たとえば、.dll
をアプリケーションを展開する <jre_home>\axbridge\bin
と呼ばれるディレクトリに格納することができる。<jre_home>
は、公開 JRE であり、非公開ではないことに注意。Windows での公開 JRE は、通常 C:\Program Files\Java\j2re1.4.2
にある。SDK と関連する非公開 JRE は、通常 C:\j2sdk1.4.2\jre
にある。-out
が指定されない場合、または -out
が <jre_home>\axbridge\bin
を指定しない場合、-reg
オプションは使用できない。たとえば、<bean>.jar
が jelly.jar
で、jelly.jar
は C:\my_bean_jars
に置かれていて、完全修飾名は sunw.demo.jelly.JellyBean
、SDK は j2sdk1.4.2
と想定します。この場合、packager.exe
を次の方法で実行できます。
C:\j2sdk1.4.2\bin\packager -clsid {D824B185-AE3C-11D6-ABF5-00B0D07B8581} -out C:\Program Files\Java\j2re1.4.2\axbridge\bin -reg C:\my_bean_jars\jelly.jar sunw.demo.jelly.JellyBean
パッケージャーは次に示す事柄を行います。
JellyBean.dll
) を使用する .dll
ファイルを生成し、j2re\axbridge\bin
ディレクトリに入れる。j2re1.4.2\axbridge\lib
ディレクトリを作成し、jelly.jar
をそこに置く。CLSID
D824B185-AE3C-11D6-ABF5-00B0D07B8581
を使用して、Bean .dll
を登録する。.dll
の手動登録上記のように、packager.exe
を使用するときに -reg
オプションを使用しない場合、regsvr32.exe
を使用して、.dll
を手動で登録できます。.dll
ファイルが置かれているディレクトリ (例 C:\Program Files\Java\j2re1.4.2\axbridge\bin
) に cd
し、次を入力します。
<path_regsvr32>\regsvr32 <bean name>.dll
Windows 2000 が稼動しているとします。Windows 2000 の regsvr32.exe
は C:\winnt\system32
にあります。この場合に JellyBean.dll
を登録するには、次のようにします。
C:\Program Files\Java\j2re1.4.2\axbridge\bin>C:\winnt\system32\regsvr32 JellyBean.dll
これにより以下が行われます。
HKEY_CLASSES_ROOT
下に、JellyBean.dll
に対する CLSID
レジストリエントリを作成する。j2re1.4.2\axbridge\lib
ディレクトリを作成し、jelly.jar
をそこに置く。Bean は ActiveX コントロールとして登録されたので、ActiveX コンテナに挿入することができます。Visual Studio 付属の ActiveX コントロールテストコンテナの場合、メインメニューで「Edit」 > 「Insert New Control...」
に進み、Bean コントロールが表示されるまでリストを下にスクロールします。「JellyBean.dll
」コントロールの場合、「JellyBean Bean Control
」と表示されます。次に Visual Studio テストコンテナへの挿入を表示します。
アプリケーションの ActiveX コントロールとしてパッケージ化された Bean を配備するには、.dll
をインストールプロセスの一部とする登録を含める必要があります。.dll
は、<jre_home>axbridge\bin
ディレクトリにインストールされ、regsvr32.exe
を使用して登録されます。前述したように、.dll
が登録されたときに、Bean .jar
は、<jre_home>\axbridge\lib
ディレクトリに格納されます。
Java オブジェクトは、IDispatch
インタフェースをサポートするラッパーオブジェクトを介してアクセスできます。つまり、ActiveX ブリッジを通して間接的にアクセスされます。たとえば Visual Basic (VB) で、パッケージ化された Bean を扱い、Java オブジェクトを Bean メソッドに引数として渡す場合、(1) Bean に Java オブジェクトの要求される型を返すメソッドがあること、または (2) Java オブジェクトが Bean プロパティーとして利用可能であるというどちらかが必要です。
たとえば、例の章にある、カレンダの例、JCalendarPanel を考慮してください。
この Bean を使用して Java を直接扱う場合、Date
オブジェクトを作成し、プロパティーを設定し、次に JCalendarePanel
の setSelectedDate()
メソッドに対する引数として渡します。これを ActiveX ブリッジを使用して行う方法を次に示します。
VB で作業していると仮定し、JCalendarPanel1
と呼ばれる JCalendarPanel
のインスタンスがあるとします。VB では JCalendarPanel1.
selectedDate
プロパティーを使用して Date
オブジェクトを、次のようにして得ることができます。
Set dat = JCalendarPanel1.selectedDate
次に Date
オブジェクト (dat
) の VB メソッドを使用して設定を行います。たとえば、次のようにします。
dat.setYear (1986 - 1900) dat.setMonth (11 - 1) dat.setDate 24
最後に、JCalendarPanel1
の setSelectedDate
メソッドを使用して date を設定します。
JCalendarPanel1.setSelectedDate dat
getMethodDescriptors()
を介する BeanInfo
により提供されるすべてのメソッドは、ActiveX コンテナからアクセス可能です。
しかし、メソッドがオーバーロードされた場合、もっとも高い数の引数をとるメソッドだけが利用可能です。これは COM IDL がオーバーロードをサポートしないからです。しかし、引数と戻り値の型は、VARIANT
になります。それぞれの引数はオプションです。どのオーバーロードしたメソッドに対しても Bean ドキュメントを参照して引数と型の正確な値を知る必要があります。MIDL キーワードと同じメソッドまたはプロパティー名は、すべて削除されます。
すべてのプロパティーは、PropertyDescriptor
を通して BeanInfo
で定義したのと同じアクセス権を使用するブリッジを通してアクセス可能です。ActiveX ブリッジは PropertyDescriptor
で定義したアクセサメソッドを呼び出します。
Bean プロパティーが bound
または constrained
の場合、bindable
または requestedit
フラグが COM プロパティーの属性内に設定されます。コンテナは IPropertyNotifySink
インタフェースを通して、プロパティーの変更を通知されます。プロパティーに制限があり、コンテナがプロパティーの変更を拒否した場合、Bean PropertyVetoException
がブリッジによりスローされます。
プリミティブ型および文字列、フォント、カラープロパティーについては、Visual Basic のような ActiveX コンテナのほとんどは、PropertySheet
内でプロパティーの直接的な操作ができます。ほかのすべてのプロパティー、たとえば配列やオブジェクトのプロパティーは PropertySheet
ではアクセスできませんが、コンテナに関連するスクリプト言語を通して呼び出すことができます。
ブリッジは 4 つの環境プロパティーをサポートします。それらは、Bean コンポーネントがそれらのプロパティーを実装する場合に、Bean プロパティーに翻訳されます。これらの環境プロパティーは、コンポーネントが初期化されるときに Bean コンポーネントにより読み込まれ設定され、環境プロパティーに対する変更の通知が行われます。
DISPID_BACKCOLOR DISPID_FORECOLOR DISPID_FONT DISPID_ENABLED
ブリッジは、ActiveX コンテナの環境プロパティーの変更を、設定プロパティーを通して Bean に転送します。
BeanInfo
により返された EventSetDescriptor
配列でデフォルトとして宣言されたすべてのソースインタフェースは、ActiveX のデフォルトのソースインタフェースとして宣言された 1 つのインタフェースに組み込まれます。ActiveX コンテナによりデフォルトのソースインタフェースがアクセス可能であることが、ActiveX の最低限の要件です。
EventSetDescriptor
の getListenerMethodDescriptors
API により返される各メソッドは、ActiveX イベントにマッピングされます。イベント名はメソッド名です。Bean のすべてのデフォルトインタフェースは固有のインタフェースにマージされるので、同じメソッド名を含むインタフェースは許可されません。
java.awt.event.ActionListener
ソースインタフェースについての例を考えましょう。
public interface ActionListener extends EventListener { public void actionPerformed(ActionEvent e); }
このインタフェース定義により生成される ActiveX イベント名は、actionPerformed
です。たとえば Visual Basic の場合、イベントシグニチャーは次のようになります。
Private Sub Button_actionPerformed (ByVal evt As Object) MsgBox evt.toString End-Sub
コンテナに提供された evt
は、オートメーションオブジェクトで、java.awt.AWTEvent
Object
を表します。コンテナは AWTEvent
クラスによりサポートされるメソッドを呼び出すことによってイベントの情報にアクセスできます。
ActiveX コントロールとしてパッケージ化される Bean はスタンドアロンのアプリケーションの一部です。このため、アプレットのサンドボックスセキュリティーモデル外で実行可能です。
Internet Explorer での Bean のスクリプトは安全ではありません。AllPermission
アクセス権が付与されるからです。
Java Plug-in コントロールパネルを通して JVM を構成できることに注意してください。次のタブが ActiveX ブリッジに関連しています。
Bean をデバッグするために Java コンソールを使用できます。