ActiveXコントロールをSWTアプリケーションへ統合する

EclipseでActiveXを使用する方法

Standard Widget Toolkit(SWT)を使用すれば、ネイティブ・アプリケーションのように操作できるスタンドアロンのJavaアプリケーションを開発することができます。Windows用のJavaクライアント・サイド・アプリケーションに時間を費やしてきた方ならば、おそらくアプリケーションにネイティブなWindowsコンポーネントを統合したいと思っておられたことでしょう。Eclipseプロジェクトの一部であるSWTは、ActiveXコントロールをスタンドアロンのSWTアプリケーションに簡単に統合し活用する方法を提供することで、このような要求に答えています。

Jeff Gunther (jeff.gunther@intalgent.com), General Manager, Intalgent Technologies

Jeff Gunther (Studio B著者)は、Java 2 Enterprise EditionおよびLotus Notes/Dominoを使用するソフトウェア製品とソリューションの新興プロバイダーである、Intalgent Technologiesのゼネラルマネージャーおよび創設者です。Jeffは複雑なソフトウェア・システムを分析、設計、開発、展開、保守した経験を持つ、アプリケーションとインフラストラクチュアの設計者です。彼の多種多様な経験は、ウェブサーバーからエンベディッドデバイスまで、マルチプラットフォームで動作するソフトウェアの完全なライフ・サイクル開発を含んでいます。彼はその初期の、「pre-Mosaic」の時代からインターネット業界に携わっています。Jeffの連絡先はjeff.gunther@intalgent.com です。



2003年 6月 05日

ここ何年も、Javaはサーバーベースのアプリケーション開発分野を支配してきました。Javaが、開発された初期、クロス・プラットフォームのデスクトップ・アプリケーションを開発するためのソリューションとして大きく宣伝されていました。しかし、残念ながら実際にはその誇大広告に応えられてはいませんでした。エンドユーザーおよび開発者コミュニティーがAbstract Window Toolkit(AWT)を超える機能の要求に関して、GUIアプリケーション開発においてJavaを見直してもらえるように、Sun MicrosystemsはSwingとして知られるJava Foundation Classes(JFC)を発表しました。Swingはクライアント・サイドのアプリケーション開発においては成熟したモデルを提供しているものの、ネイティブ・アプリケーションの視覚的なアピールおよびオペレーションに関してはまだまだ物足りないものでした。

Standard Widget Toolkit(SWT)の開発および発表以前には、業界の専門家や開発者は一様にJavaはデスクトップ・アプリケーションの開発としては役に立たないと言明していました。SWTは、ネイティブ・アプリケーションを忠実に模倣したアプリケーションを作成するために、開発者にフレームワークを提供することで、クライアント・サイドJavaに新しい生命を吹きこみ始めています。その前任者(例えばAWTやJFC)とは異なり、SWTはオペレーティング・システムに固有のウィンドウ操作環境と密接に統合され、プラットフォームに依存しないAPIを開発者に提供しています。Eclipseプロジェクトは、Java用のオープンソースの統合開発環境(IDE)として考えられてきた一方で、そのプロジェクトの目的ははるかに広範囲です。EclipseのWebサイトのフロントページにおいては、Eclipseは次のように記述されています。「ある種の汎用的なツールの基盤-誰にとっても拡張可能なIDE」であると。

今回のサンプルアプリケーション開発においては、Eclipseを使用し、スタンドアロンのアプリケーション・コンテキスト内でActiveXコントロールを使用する方法の実証に焦点をあてていきます。Eclipseプロジェクトについての詳細および背景に関しては、この記事の最後にある参考文献を参照してください。

PDF viewer アプリケーション

SWTアプリケーションへActiveXコントロールを統合する方法のコードと実装の詳細について概説する前に、サンプルアプリケーションの目的および構造について説明をしておきましょう。このアプリケーションはユーザーがAdobeのAcrobat Readerコントロールを使用して、PDFファイルを参照したり、やりとりをすることができる単純なPDF viewerです。ユーザーはハードディスク内に配置されたファイルや、図1のようなSWTアプリケーション内でPDFドキュメントを参照することができます。

図1.サンプルアプリケーション:Microsoft Windows XP上で動作しているPDF viewer
PDF Viewer

環境条件

参考文献のリンクから、サンプルのPDF viewerアプリケーションをダウンロードすることができます。PDF viewerアプリケーションを試すには、最低限以下のような環境を満たしていなければなりません。

  • Microsoft Windows のオペレーティング・システム
  • Java 2 SDK,Standard Edition 1.4以降のバージョンがインストールされていること(ダウンロード・リンクに関しては参考文献を参照してください)。
  • Apache Ant 1.5.2 以降のバージョンがインストールされていること(ダウンロード・リンクに関しては参考文献を参照してください)。
  • Adobe Acrobat Reader 5.0 がインストールされていること

Antビルドスクリプトはクロス・プラットフォームで構築できるように配慮されていますが、PDF viewerアプリケーションはMicrosoft Windows XP上のみでテスト確認されています。では、サンプル・アプリケーションをインストール/セットアップをすることから始めましょう。


PDF viewerアプリケーションのインストールとビルド

PDF viewerアプリケーションのインストールおよびビルドは、以下のステップで行います。

  1. 参考文献のリンクからソースコードのパッケージをダウンロードしてください。
  2. pdfviewer.zipファイルを一時ディレクトリーに解凍してください。
  3. 新しく作成したディレクトリーで以下のコマンドを実行してください。ant clean
  4. 新しく作成したディレクトリーで以下のコマンドを実行してください。ant

環境条件を満たし適切に設定が出来ていれば、以下のように出力されるはずです。

Buildfile: build.xml
init:
    [mkdir] Created dir: D:\PDFViewer\dist
compile-common:
compile-module:
    [echo] Compiling ...
    [mkdir] Created dir: D:\PDFViewer\build
    [mkdir] Created dir: D:\PDFViewer\build\classes
    [javac] Compiling 5 source files to D:\PDFViewer\build\classes
package-common:
      [jar] Building jar: D:\PDFViewer\dist\pdfviewer.jar
default:
BUILD SUCCESSFUL

ActiveXコントロールの使用

PDF viewerアプリケーションの基本を説明しましたので、ここからはSWTアプリケーション内にActiveXコントロールを統合して使用する方法を検討してみましょう。ここでの目的はActiveXの統合を対象としているので、スタンドアロンのSWTアプリケーションを作成する方法や、Microsoft WindowsでActiveXコントロールを使用する方法などは対象外です。Eclipseのワークベンチ以外でのSWTコンポーネントの使用方法についての詳細や背景に関しては、この記事の最後にある参考文献から、Adrian Van Emmenis氏による3部シリーズの記事を参照してください。

リスト1は、PDFViewerクラスの基本的な構造を概説し、ActiveXコントロールがSWTアプリケーションへどのように統合されるのかを示しています。

リスト1.PDFViewerクラス
1   public class PDFViewer extendsApplicationWindow
2   {
3      private OleControlSite site;
4      private OleAutomation auto;
5
6      public PDFViewer()
7      {
8         super(null);
9         this.addMenuBar();
10      }
11
12      protected ControlcreateContents(Composite parent)
13      {
14         Shell shell = this.getShell();
15         shell.setText("PDFViewer");
16         shell.setSize(500, 450);
17
18         OleFrame frame = new OleFrame(shell, SWT.NONE);
19
20         try
21         {
22            site = new OleControlSite(frame,SWT.NONE, "PDF.PdfCtrl.5");
23            auto = new OleAutomation(site);
24            
25   ...

コードを少しずつ見ていきましょう。

  1. アプリケーションが起動する時は常にPDFViewerクラスの新しいインスタンスが作成されます。
  2. 3行目と4行目のように、OleControlSiteOleAutomation の2つのオブジェクトを定義する必要があります。OleControlSiteオブジェクト変数は、ActiveXコントロールとのやりとりを処理します。OleAutomationオブジェクトは、開発者がプロパティにアクセスし、ActiveXコントロールで提供されているコマンドを実行できるようにします。
  3. 18行目では、OleFrameオブジェクトが定義されています。このオブジェクトはActiveXコントロール用のコンテナーで、コントロールのライフ・サイクルを管理しています。
  4. 22行目は2つの引数を使用したサイト変数の事例です。最初の引数は、OleFrameへの参照で、2番目の引数は、ActiveXコントロールを識別する文字列です。Windowsのレジストリー内にあるプログラム識別子では、Microsoft Windows内のコントロールをユニークに識別しています。
  5. 23行目はOleControlSite変数への参照を使用したサイト変数の事例です。

PDFドキュメントの選択

ユーザーはワークステーションからPDFドキュメントを選択することで、PDFドキュメントを参照することができます。リスト2のコードは、エンドユーザーにファイル・ダイアログを見せるために必要なオブジェクトおよびメソッドを示しています。

リスト2.OpenActionクラス
0  ?
1  public class OpenAction extends Action
2  {
3     ApplicationWindow window;
4
5     public OpenAction(ApplicationWindow w)
6     {
7           window = w;
8           this.setText("&Open...");
9
10          this.setToolTipText("Open a PDF document.");
11       }
12
13       public void run()
14       {
15       FileDialog dialog = new FileDialog(window.getShell());
16       dialog.open();
17
18       String file = dialog.getFilterPath()+"\\"+dialog.getFileName();
19
20       PDFViewer viewer = ((PDFViewer)window);
21
22       viewer.loadFile(file);
23
24       }
25    }

このコードを簡単に見ていきましょう。

  1. ユーザーがメニューバーから「Open...」を選択すると、13行目のrunメソッドが実行されます。
  2. 15行目と16行目では、FileDialogオブジェクトが作成されています。図2のように、このオブジェクトはユーザーへネイティブなファイル・ダイアログ・ボックスを表示します。
  3. 18行目では、ユーザーのワークステーション上にあるPDFドキュメントの位置を含んだ文字列を作成しています。
  4. 20行目では、PDFViewerオブジェクトにwindowオブジェクトを割り当てています。
  5. 22行目では、loadFileメソッドを実行し、選択されたPDFドキュメントのロケーションを渡しています。loadFileメソッドについては次の2つのセクションで詳細に検討します。
図2.オープン・ファイル・ダイアログ
The Open File Dialog

ActiveXコマンドのリスト

PDFドキュメントがどのようにviewerアプリケーションで表示されるのかを説明する前に、Adobe Acrobat Reader Active X (PDF.PdfCtrl.5)コンポーネントにおいて、実際にどんなコマンドが利用できるのかを理解しておくことが役に立ちます。サンプル・コードのパッケージは、IBMで開発したクラスを含んでいます。このクラスは、ActiveXコントロールが公開している公式コマンドを全て列挙しています。

PDF.PdfCtrl.5コントロールのコマンドを列挙するには、PDFViewerディレクトリーで以下のコマンドを実行してください。:ant activex

環境が適切に設定されていれば、次のような出力となるはずです。

...
     [java]Functions for PDF.PdfCtrl.5 :
       [java]METHOD (id = 2) :
     [java]     Signature   : boolean LoadFile([] String fileName)
     [java]     Description : null
     [java]     Help File   : null
       [java]METHOD (id = 3) :
     [java]     Signature   : void setShowToolbar([] boolean On)
     [java]     Description : null
     [java]     Help File   : null
       [java]METHOD (id = 4) :
     [java]     Signature   : void gotoFirstPage()
     [java]     Description : null
     [java]     Help File   : null
...

ActiveXコントロールの他のコマンドを参照するためには、ソースコードと共に含まれているbuild.xmlファイルを簡単に編集して、クラスの引数を他のActiveXのプログラム識別子と交換してください。リスト3のAnt targetは、コントロールのプログラム識別子を挿入する位置を示しています。

リスト3.build.xmlファイルの編集
...
      <target name="activex" depends="package-common">
            <java classname="Main" fork="true">
                     <jvmarg value="-Djava.library.path=${eclipse.dir}windows"/> <classpath>
                        <pathelement location="${dist.dir}/pdfviewer.jar"/>
                              <fileset dir="${eclipse.dir}" includes="*.jar"/>
                              <fileset dir="${eclipse.dir}windows" includes="*.jar"/>
                      </classpath>
                      <arg value="<insert some program identifier>"/> </java>
      </target> 
...

クラスから出力された最初のコマンドはLoadFileでした。PDF viewerアプリケーションにおけるこのコマンドの利用方法を調べてみましょう。


ActiveXコマンドの実行

ユーザーがPDFドキュメントを選択すれば、PDFViewerクラスはActiveXコントロールに公開してあるコマンドを実行する必要があります。以下のリスト4は、ユーザーの選択したPDFドキュメントに、ActiveXコントロールをロードさせるために必要なオブジェクトおよびメソッドを示しています。

リスト4.PDFViewerクラス
0   ...
1   public void showPdfControl()
2   {
3      site.doVerb(OLE.OLEIVERB_SHOW);
4   }
5
6   public void loadFile(String file)
7   {
8      showPdfControl();
9
10      int[] rgdispid = auto.getIDsOfNames(newString[]{"LoadFile"});
11      int dispIdMember = rgdispid[0];
12
13      Variant[] rgvarg = new Variant[1]; 
14      rgvarg[0] = new Variant(file);
15
16      Variant pVarResult =auto.invoke(dispIdMember,rgvarg);
17   }
18...

少しずつコードを検証してみましょう。

  1. ユーザーがPDFファイルを選択すると、6行目のloadFile メソッドが実行されます。
  2. 8行目では、showPdfControlメソッドをコールしています。ActiveXコントロールは、アプリケーション上に現れる前にdoVerbコマンドを使用して活性化させなければなりません。verbsの完全なリストおよび概要は、EclipseのWebサイト上の「ActiveX Support In SWT」という記事で参照することができます(この記事へのリンクに関しては参考文献を参照してください)。
  3. 10~16行目では、ActiveXコントロール内でLoadFileコマンドを呼び出しています。ここで使用されている各オブジェクトの詳細な使用方法については、参考文献のorg.eclipse.swt.ole.win32 JavaDocのリンクを参照してください。

PDF viewerアプリケーションの実行

PDF viewerアプリケーションの実行は、以下のステップで行います。

  1. ソースコードを解凍したディレクトリーで以下のコマンドを実行してください。ant run
  2. Antスクリプトの実行により、PDF viewerアプリケーションが表示されます。
  3. ワークステーションからPDFファイルを選択するために、ファイルメニューから「Open...」を選択します。これで、選択したPDFドキュメントが表示されます。

要約

SWTライブラリーは、Java開発者に、高度な対話形式のクライアント・サイド・アプリケーションへMicrosoft Windows ActiveXコントロールを統合するための強力なメカニズムを提供します。ActiveXコントロールやOLEドキュメントに関するSWTのサポートを利用して、ネイティブのウィジェットとコンポーネントを統合する見た目の良いアプリケーションを作成する方法を考えることはとても面白いことです。


ダウンロード

内容ファイル名サイズ
os-activex/pdfviewer.zip---

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=232660
ArticleTitle=ActiveXコントロールをSWTアプリケーションへ統合する
publish-date=06052003