JavaBeansをActiveXコンポーネントにする
 

ActiveXコンポーネントをブラウザから使うとは....

「おい田中(仮名 YTPのこと)、WEBサーバからダウンロードしたCSVファイルをそのままExcelマクロに渡して、 きれいに整形してからExcel画面を出してね。」とつい二日前、 私の上司のA取締役から言われました。 今作っているシステムの仕様の件です。
YTP 「えっ?! それってブラウザからExcelのマクロを起動しろってことですか?」
A取締役 「当然だよ。」
YTP 「でも、署名付きアプレットかActiveXでも使わないとそれはできませんよ。
署名付きアプレットは認証局から証明書を発行してもらわないといけないし、
VB嫌いなのにActiveXなんて作ったことあるわけないじゃないですか....」
A取締役 「ダウンロードしたファイルをダブルクリックしてさらにマクロを自分で呼び出せなんて
エンドユーザに言えると思う? ワンクリックだよワンクリック、田中」
YTP 「そんなこと言ってもできなもいのは.....」
A取締役 「来週のデモに間に合わせてね〜」
YTP 「・・・・・・」

ということで調べ始めたら、な、な、のぁーんと、 JavaでActiveXコンポーネントが作れるげなっ!!
  • ActiveXコンポーネントをブラウザから呼ぶことで、 JavaScriptやアプレットでは出来ない機能をブラウザ上に実装することが可能になります。
  • ActiveXコンポーネントが動作するのは、クライアントがWindows系のOSに限定されます。
  • JavBeansのActiveXコンポーネントを実行するためには、クライアントに Java Plug-inがインストールされいている必要があります。
  • ActiveXコンポーネントを実行するためには、クライアントのレジストリに事前登録する必要があります。 (サイトからダウンロードさせて自動登録する方法もありますが、今勉強中です(^_^;)
IEからエクスプローラを起動できましたっ!!

作成の手順です。

1.Beanの作成
2.コンパイル
3.マニフェストファイルの作成
4.jarファイルの作成
5.ActiveXコンポーネント化
6.HTMLファイルの準備
7.関連リンク

1.Beanの作成

今回は、ブラウザが動作しているクライアントマシンの任意の実行モジュールを起動するという 世にも恐ろしい(^_^)コンポーネントを作ります。
本来Beanはプロパティを持つものなんですが、このクラスでは必要ないため持っていません。
invokeメソッドでは受け取ったパラメータを実行モジュールとして起動している(26行目)だけです。
InvokeExec.java
   1: package ytp.misc;
   2: 
   3: import java.io.*;
   4: 
   5: /**
   6:  *  クライアントの任意の実行モジュールを起動するためのクラス。<BR>
   7:  *  ActiveXコンポーネントとして使用する。
   8:  */
   9: public class InvokeExec implements Serializable {
  10:     /**
  11:      * デフォルトコンストラクタです。
  12:      */
  13:     public InvokeExec() {
  14:     
  15:     }
  16:     
  17:     /**
  18:      *  sExecuteで指定された実行モジュールを起動します。
  19:      *  @param sExecute 起動対象実行モジュールの絶対パス。
  20:      */
  21:     public void invoke(String sExecute) {
  22:         Runtime thisRuntime = Runtime.getRuntime();
  23:         Process thisProcess = null;
  24:         
  25:         try {
  26:             thisProcess = thisRuntime.exec(sExecute);
  27:         } catch (IOException e) {
  28:             e.printStackTrace();
  29:         }
  30:     }
  31: }

2.コンパイル

このクラスはパッケージ名がytp.miscなので適当などこかにytp\miscというディレクトリを作り、 その中にInvokeExec.javaを置いて下さい。
C:\Source\Java\ytp\misc>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 5854-25F8 です

 C:\Source\Java\ytp\misc のディレクトリ

2003/02/18  19:39       <DIR>          .
2003/02/18  19:39       <DIR>          ..
2003/02/18  19:39                  756 InvokeExec.java
               1 個のファイル                 756 バイト
               2 個のディレクトリ  60,309,258,240 バイトの空き領域

C:\Source\Java\ytp\misc>
おっと、CLASSPAtd環境変数に.(ピリオド)は入っていますか?
カレントディレクトリをytpの一つ上にして次のようにコンパイルします。 エラーが出なければOKです。
C:\Source\Java\ytp\misc>cd ..\..

C:\Source\Java>javac ytp\misc\InvokeExec.java

C:\Source\Java>

3.マニフェストファイルの作成

manifest.txt
Name: ytp/misc/InvokeExec
Java-Bean: true
各行の:(コロン)の後ろには必ずスペースを入れて下さい。 スペースがないとjarファイル作成でエラーになります。
jarファイルの中でJavaBeanにしたいものはJava-Bean:という属性をtrueとしておきます。
これをytp\misc\manifest.txtというファイルとして保存して下さい。

4.jarファイルの作成

カレントディレクトリをytpの一つ上にして次のように実行してください。
C:\Source\Java>jar cvfm activex.jar ytp\misc\manifest.txt ytp\misc
マニフェストが追加されました。
ytp/misc/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
ytp/misc/InvokeExec.class を追加中です。(入 = 546) (出 = 367)(32% 収縮されました
)
ytp/misc/InvokeExec.java を追加中です。(入 = 756) (出 = 431)(42% 収縮されました)

ytp/misc/manifest.txt を追加中です。(入 = 44) (出 = 46)(-4% 収縮されました)

C:\Source\Java>
こうすると、ytp\misc配下のクラス全てがactivex.jarファイルの中に格納されます。 ですが、ActiveXコンポーネントとして利用出来るのはあくまでJava-Bean:属性がtrueのものだけです。

5.ActiveXコンポーネント化

java.sun.comのページJavaBeansを Microsoft ActiveX コンポーネントとして使用するには の解説ページの「手順0」〜「手順5」を参考にしながらパッケージャを使って、 ActiveXコンポーネント化します。

パッケージャの実行が終わると、InvokeExec.regInvokeExec.tlbの 2つのファイルが上記ページの手順4:で指定した出力先に作成されます。
*.tblファイルの中身は読めませんが、*.regはご存じレジストリ情報です。 JREが持つbeans.ocxと作成したjarファイルのパスなどが書かれています。
InvokeExec.reg
REGEDIT4
[HKEY_CLASSES_ROOT\InvokeExec.Bean]
@= "InvokeExec Bean Control"
[HKEY_CLASSES_ROOT\InvokeExec.Bean\CLSID]
@= "{84A619DC-F843-40CC-A338-D2FEA983F829}"
[HKEY_CLASSES_ROOT\InvokeExec.Bean\CurVer]
@= "1"
[HKEY_CLASSES_ROOT\InvokeExec.Bean.1]
@= "InvokeExec Bean Control"
[HKEY_CLASSES_ROOT\InvokeExec.Bean.1\Insertable]
[HKEY_CLASSES_ROOT\InvokeExec.Bean.1\CLSID]
@= "{84A619DC-F843-40CC-A338-D2FEA983F829}"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}]
@= "InvokeExec Bean Control"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\InprocServer32]
@= "C:\\Program Files\\JavaSoft\\JRE\\1.3.1\\bin\\beans.ocx"
"ThreadingModel" = "Apartment"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\ToolboxBitmap32]
@= "C:\\Program Files\\JavaSoft\\JRE\\1.3.1\\bin\\beans.ocx,0"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\TypeLib]
@= "{53E74C1F-2F3E-4255-B090-E37B4399F33B}"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\ProgID]
@= "InvokeExec.Bean.1"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\VersionIndependentProgID]
@= "InvokeExec.Bean"

[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\JarFileName]
@= "D:\\NtAp\\Tomcat3.2.3\\webapps\\h9\\WEB-INF\\classes\\activex.jar"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\JavaClass]
@= "ytp.misc.InvokeExec"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\InterfaceClass]
@= "sun/beans/ole/OleBeanInterface"

[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\Control] 
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\Programmable] 
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\Insertable] 
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\MiscStatus]
@= "0"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\MiscStatus\1]
@= "3473"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\DefaultIcon]
@= "D:\\NtAp\\Tomcat3.2.3\\webapps\\h9\\WEB-INF\\classes\\awt.ico"

[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\Version]
@= "1.0"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\DataFormats\GetSet\0]
@= "2,1,16,1"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\DataFormats\GetSet\1]
@= "3,1,32,1"

[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\DataFormats\GetSet\2]
@= "14,1,64,1"

[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\DataFormats\GetSet\3]
@= "1,1,1,1"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\verb\0]
@= "&Edit,0,2"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\verb\-1]
@= "Show,0,0"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\verb\-2]
@= "Open,0,0"
[HKEY_CLASSES_ROOT\CLSID\{84A619DC-F843-40CC-A338-D2FEA983F829}\verb\-3]
@= "Hide,0,1"

[HKEY_CLASSES_ROOT\TypeLib\{53E74C1F-2F3E-4255-B090-E37B4399F33B}]
@= "InvokeExec Bean Control Type Library"
[HKEY_CLASSES_ROOT\TypeLib\{53E74C1F-2F3E-4255-B090-E37B4399F33B}\1.0]
@= "InvokeExec Bean Control "
[HKEY_CLASSES_ROOT\TypeLib\{53E74C1F-2F3E-4255-B090-E37B4399F33B}\1.0\0\win32]
@= "D:\\NtAp\\Tomcat3.2.3\\webapps\\h9\\WEB-INF\\classes\\InvokeExec.tlb"
[HKEY_CLASSES_ROOT\TypeLib\{53E74C1F-2F3E-4255-B090-E37B4399F33B}\1.0\FLAGS]
@= "2"
[HKEY_CLASSES_ROOT\TypeLib\{53E74C1F-2F3E-4255-B090-E37B4399F33B}\1.0\HELPDIR]
@= "D:\\NtAp\\Tomcat3.2.3\\webapps\\h9\\WEB-INF\\classes" 
パッケージャの実行過程でレジストリ登録は完了しています。 (レジストリに自動登録するオプションをチェックした場合)

6.HTMLファイルの準備

次はいよいよブラウザから呼び出します。
<OBJECT>タグにはIDCLASSIDという属性を書きます。
IDは、自分が作ったBeanをこのHTMLから呼び出す時の名前になります。クラス名と一緒にしておくのが無難でしょう。
CLASSIDは、先ほど作ったレジストリファイルの中のクラスIDを書きます。
呼び出しはJavaSciprtで書いてます。onClickイベントの際にInvokeExec.invoke()を呼び出し、 パラメータにdocument.INVOKEFORM['TARGET'].valueつまり画面から入力された実行モジュール名を渡します。
InvokeExec.html
<HTML>
<HEAD>
    <TITLE>エクスプローラの起動!!!</TITLE>
</HEAD>
<BODY>
    <!-- 恐ろしいことに、これでローカルの実行モジュールを起動出来るらしい.... -->
    <FORM name="INVOKEFORM">
        <INPUT type="text" size=40 name="TARGET" value="explorer">
        <INPUT type="button" name="INVOKE" value="押してみてネ"
            onClick="InvokeExec.invoke(document.INVOKEFORM['TARGET'].value)">
    </FORM>
    <OBJECT ID="InvokeExec" CLASSID="CLSID:84A619DC-F843-40CC-A338-D2FEA983F829">
        <PARAM NAME="code" value="ytp.misc.InvokeExec">
        <PARAM NAME="archive" value="activex.jar">
        <PARAM NAME="type" value="application/x-java-bean">
    </OBJECT>
</BODY>
</HTML>

Java Plug-inは、事前にインストールされていない場合にWEBサーバからダウンロードしてくる 設定にもできます。 次のようにcodebase属性を追加し、JREインストールモジュールが配置してあるサーバを指定して下さい。
<OBJECT ID="InvokeExec" CLASSID="CLSID:84A619DC-F843-40CC-A338-D2FEA983F829"
    codebase="http://ytp.ne.jp/plugin/j2re-1_3_1_01-win-i.exe#Version=1,3,1,1">

7.関連リンク

JavaBeansを Microsoft ActiveX コンポーネントとして使用するには
Java Plug-in のホームページ
イントラネット環境での Java Plug-in の利用について


Copyright © 2002-2016, Your Technology Partner. All rights reserved.