このドキュメントでは、次のトピックについて説明します。
「アプリケーションの例」 の章では 2 つの例となるアプリケーションについて説明します。
ActiveX ブリッジは、JavaBeans(TM) コンポーネントアーキテクチャ (「Bean」) に基づくコンポーネントを、ActiveX コントロールとして効率的にパッケージすることができます。そのため ActiveX コントロールを ActiveX コンテナ内の機能的なコンポーネントとして使用できます。
この ActiveX ブリッジの実装は、SDK/JRE 1.1 から 1.3.1 までの以前の実装とは互換性がないことに注意してください。この新しいブリッジを使用するには、Beans を再パッケージ化する必要があります。
開発目的用に、この実装は次の OS と ActiveX コンテナをサポートします。
OS: Windows NT、2000、XP
ActiveX コンテナ: Visual Studio 6.0 (SP3)
パッケージ化された Beans は、上記のプラットフォームとコンテナだけでなく、すべての Windows プラットフォームと ActiveX コンテナで稼動することに注意してください。
説明 1. パッケージャ (
2. パッケージャを実行するためには、最初に |
packager.exe
を使用して、Bean に対する .dll
を生成します。
packager.exe
の使用方法を次に示します。
パッケージャの使用方法使用方法:packager [-options] <jar file name> <bean name> |
.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
パラメータを指定する場合、パッケージャは .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 control」が表示されるまでリストを下にスクロールします。「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 イベントにマッピングされます。イベント名はメソッド名です。Beans のすべてのデフォルトインタフェースは固有のインタフェースにマージされるので、同じメソッド名を含むインタフェースは許可されません。
次の 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 Control Panel を通して JVM を構成できることに注意してください。次のタブが ActiveX ブリッジに関連しています。
Beans をデバッグするために Java Console を使用できます。