このドキュメントでは、次のトピックについて説明します。
「アプリケーションの例」の章では 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 コンソールを使用できます。