`

将 ActiveX 控件集成到 SWT 应用程序

阅读更多
通过使用标准窗口小部件工具箱(Standard Widget Toolkit,SWT),您可以开发独立的 Java 应用程序,它看起来和操作起来类似本机应用程序。如果您花了很多时间来开发用于 Windows 的 Java 客户机端应用程序,那么您或许希望将一些本机 Windows 组件集成到您的应用程序中。SWT,作为正在开发中的 Eclipse 项目的一部分,通过为您提供在独立 SWT 应用程序中方便地利用和集成 ActiveX 控件的方法来实现这一需求。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

多年以来,Java 语言已经“统治”了基于服务器的应用程序的开发领域。在该语言开发早期,人们将它吹捧为开发跨平台的桌面应用程序的解决方案。遗憾的是,事实上它从未符合过这种大肆宣传。在最终用户和开发人员社区需要抽象窗口工具箱(Abstract Window Toolkit,AWT)之外的一些其它功能之后,Sun Microsystems 引入了 Java 基础类(Java Foundation Classes,JFC)(也称为 Swing)来诱使开发人员重新考虑将 Java 语言用于开发 GUI 应用程序。虽然 Swing 确实为开发客户机端的应用程序提供了一个成熟且经证实的模型,但它仍缺少本机应用程序的可视外观和操作。

在开发和引入标准窗口小部件工具箱(SWT)之前,业内权威人士和开发人员都宣告 Java 语言不适合开发桌面应用程序。SWT 通过为开发人员提供一个创建应用程序的框架(所创建的应用程序完全逼真地模仿本机应用程序),正开始给客户机端 Java 的时机带来新气象。与其前辈(例如 AWT 和 JFC)不同,SWT 给开发人员提供了一个与平台无关的 API,该 API 与操作系统的本机窗口环境紧密地集成在一起。虽然,传统上认为 Eclipse 项目是 Java 的开放源码集成开发环境(IDE),但是该项目涉及的范围更广。在 Eclipse 的网站首页上,将 Eclipse 描述成“……一种通用工具平台 — 只不过是一个开放的可扩展 IDE,并没什么特别之处。”

虽然在开发本文提供的样本应用程序期间使用了 Eclipse,但是我们将着重演示如何在独立应用程序的上下文中使用 ActiveX 控件。有关 Eclipse 项目的更多信息和背景知识,请参阅本文末尾的 参考资料

PDF 查看器应用程序

在查看如何将 ActiveX 控件集成到 SWT 应用程序的代码和实现细节之前,让我们查看一下所包含的样本应用程序的用途和结构。该应用程序是一个简单的 PDF 查看器,它允许用户使用 Adobe 的 Acrobat Reader 控件来查看 PDF 文件并与之交互。用户可以在 SWT 应用程序中浏览其硬盘驱动器、定位文件和查看 PDF 文档,如 图 1中所示。

图 1. 样本应用程序:在 Microsoft Windows XP 上运行的 PDF 查看器
PDF 查看器





环境需求

可以使用 参考资料中的链接下载样本 PDF 查看器应用程序。要测试 PDF 查看器应用程序,环境必须满足下列最低需求:

  • Microsoft Windows 操作系统
  • 安装了 Java 2 SDK,标准版 1.4 或更高版本(请参阅 参考资料以获取下载链接)
  • 安装了 Apache Ant 1.5.2 或更高版本(请参阅 参考资料以获取下载链接)
  • 安装了 Adobe Acrobat Reader 5.0

虽然已经费心使 Ant 构建脚本可以跨平台使用,但是只在 Microsoft Windows XP 上测试和验证了 PDF 查看器应用程序。让我们从安装和设置样本应用程序开始吧。





安装和构建 PDF 查看器应用程序

要安装和构建 PDF 查看器应用程序,请完成下列步骤:

  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 查看器应用程序的基础知识,那就让我们研究一下如何在 SWT 应用程序中集成和使用 ActiveX 控件。因为我们这里的目的是讨论 ActiveX 集成,所以我们将不研究如何创建独立的 SWT 应用程序以及如何在 Microsoft Windows 中使用 ActiveX 控件。有关如何在 Eclipse Workbench 之外使用 SWT 组件的更多信息和背景知识,请参阅 Adrian Van Emmenis 的由三部分所组成的文章系列,本文末尾的 参考资料这一节中突出显示了这些文章。

清单 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 行所示,我们需要定义两个对象: OleControlSiteOleAutomationOleControlSite 对象变量处理与 ActiveX 控件的交互。 OleAutomation 对象允许开发人员访问特性并执行 ActiveX 控件所提供的命令。
  3. 在第 18 行上,定义了 OleFrame 对象。该对象是 ActiveX 控件的容器,并管理该控件的生命周期。
  4. 在第 22 行上,通过使用两个参数来实例化 site 变量:第一个参数包含对 OleFrame 的引用,第二个参数包含标识 ActiveX 控件的字符串。程序标识符(可在 Windows 注册表中找到)在 Microsoft Windows 中唯一地标识该控件。
  5. 在第 23 行上,使用对 OleControlSite 变量的引用来实例化 site 变量。




选择 PDF 文档

在用户可以查看 PDF 文档之前,用户需要从其工作站选择 PDF 文档。下面 清单 2中的代码说明了为最终用户打开一个文件对话框所必需的对象和方法。


清单 2. OpenAction 类

0   ...
1   public class PDFViewer extends ApplicationWindow
2   {
3      private OleControlSite site;
4      private OleAutomation auto;
5
6      public PDFViewer()
7      {
8         super(null);
9         this.addMenuBar();
10      }
11
12      protected Control createContents(Composite parent)
13      {
14         Shell shell = this.getShell();
15         shell.setText("PDF Viewer");
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. 每当用户从菜单栏选择“Open...”时,都要执行第 13 行上的 run 方法。
  2. 如第 15 行和第 16 行所示,创建一个 FileDialog 对象。如 图 2 所示,该对象向用户显示一个本机文件对话框。
  3. 第 18 行构造一个字符串,该字符串包含 PDF 文档在用户工作站上的位置。
  4. 第 20 行将 window 对象的数据类型转换成 PDFViewer 对象。
  5. 第 22 行执行 loadFile 方法并传入所选 PDF 文档的位置。在接下来的几节中,我们将更详细地研究 loadFile 方法。

图 2. Open File 对话框
Open File 对话框





列出 ActiveX 的命令

在讨论如何在查看器应用程序中显示 PDF 文档之前,了解在 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 的程序标识符替换该类的参数。下面的 Ant 目标说明了要插入控件的程序标识符的位置。


清单 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 查看器应用程序中应用这个命令。





执行 ActiveX 命令

一旦用户选择了一个 PDF 文档, PDFViewer 类就需要执行 ActiveX 控件中所公开的命令。下面 清单 4中的代码说明了使 ActiveX 控件装入用户所选的 PDF 文档所需的对象和方法。


清单 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 方法。必须使用 doVerb 命令激活 ActiveX 控件之后,该控件在应用程序中才可见。在 Eclipse 网站上标题为“ActiveX Support In SWT”的文章中可以找到动词的完整清单和概述(请参阅 参考资料以获取该文章的链接)。
  3. 第 10 行到第 16 行调用 ActiveX 控件中的 LoadFile 命令。有关如何使用在这些行中用到的每个对象的更多信息,请参阅 参考资料中的链接以获取 org.eclipse.swt.ole.win32 JavaDoc。




运行 PDF 查看器应用程序

要测试和运行 PDF 查看器应用程序,请完成下列步骤:

  1. 在将源代码解包的目录中执行下面这个命令: ant run
  2. 执行 Ant 脚本之后,应当会出现 PDF 查看器应用程序。
  3. 从 File 菜单选择“Open...”,以从工作站选择 PDF 文件。呈现所选的 PDF 文档。





结束语

SWT 库向 Java 开发人员提供一种功能强大的机制,使 Microsoft Windows ActiveX 控件集成到高度交互的客户机端应用程序。有了 SWT 对 ActiveX 控件和 OLE 文档的支持,研究如何创建外观极棒的且集成了本机窗口小部件和组件的应用程序是令人激动的。






参考资料





关于作者

Jeff Gunther 是 Intalgent Technologies的总经理和创始人,这家公司是新兴的软件产品和解决方案供应商,其产品和解决方案采用 Java 2 企业版和 Lotus Notes/Domino 平台。Jeff 从早期的“Mosaic”(最早的 Internet Web 浏览器)出现之前的时代就投身于因特网行业。他拥有软件生命周期所有方面的专业经验,包括 Java/J2EE、DHTML、XML/XSLT、数据库设计和手持设备方面的特殊软件开发专业经验。可以通过 jeff.gunther@intalgent.com与他联系。


from developerWorks
中国
分享到:
评论
1 楼 chenhj520 2011-05-24  
我执行ant
F:\pdfviewer\PDFViewer>ant activex
Buildfile: F:\pdfviewer\PDFViewer\build.xml

init:

compile-common:

compile-module:
     [echo] Compiling ...

package-common:

activex:
     [java] Unable to open type library for PDF.PdfCtrl.5

BUILD SUCCESSFUL
Total time: 2 seconds




Unable to open type library for PDF.PdfCtrl.5
显示无法打开PDF.PdfCtrl.5 不知道是那里设置不正确?


执行ant run 时
F:\pdfviewer\PDFViewer>ant run
Buildfile: F:\pdfviewer\PDFViewer\build.xml

init:

compile-common:

compile-module:
     [echo] Compiling ...

package-common:

run:
     [java] org.eclipse.swt.SWTException: Class ID not found in registry result = -2147221005
     [java]     at org.eclipse.swt.ole.win32.OLE.error(OLE.java:317)
     [java]     at org.eclipse.swt.ole.win32.OleClientSite.getClassID(OleClientSite.java:629)
     [java]     at org.eclipse.swt.ole.win32.OleContrFailed to create <<Acrobat>> : Class ID not found in registry result = -21472
21005olSite.<init>(OleControlSite.java:87)
     [java]     at com.intalgent.pdfviewer.PDFViewer.createContents(PDFViewer.java:44)
     [java]     at org.eclipse.jface.window.Window.create(Window.java:302)
     [java]     at org.eclipse.jface.window.Window.open(Window.java:552)
     [java]     at com.intalgent.pdfviewer.PDFViewer.main(PDFViewer.java:69)
     [java] 


Class ID not found in registry result = -2147221005

不能注册这个ID,不知道这个问题怎么解决?

相关推荐

    ActiveX 控件导入程序

    这个生成的控件承载 ActiveX 控件并将其属性、方法和事件公开为生成控件的属性、方法和事件。 如果不包装一下直接用,会出现 灾难性 错误。上面已经说明了原因。 在项目中引用生成的ax开头的dll,在窗体代码中增加:...

    ImageViewer ActiveX控件

    ImageViewer ActiveX控件 是一个ActiveX 控件,您可以利用它在您开发的程序中集成图片浏览功能,支持大部分常见的图片格式,可用于Microsoft Visual Studio,Microsoft Office 和 Borland Delphi。 &lt;br&gt; ...

    ActiveX控件的使用与开发

    ActiveX控件的使用与开发 ActiveX控件的使用与开发 ActiveX控件的使用与开发

    Visual Basic编程晋级:ActiveX控件

    本书全面地介绍了ActiveX控件的基本概念和设计ActiveX控件的基本方法,详细介绍了各种技术或编程手段在 ActiveX控件中的应用,并着重 介绍了类模块、Windows API调用、子类、数据绑定技术等许多高级编程内容。本书...

    MFC调用Delphi开发的ActiveX控件

    一般地,高版本Delphi向导开发的ActiveX控件直接在MFC应用程序中使用是有问题的,其中一个问题就是MFC中出现双接口标识的断言,或者直接初始化应用时出现其它断言,解决办法包括修改MFC头文件等暴力办法,该Hello ...

    VC程序内部注册ActiveX 控件

    VC程序内部注册ActiveX 控件

    源码名称:取硬盘序列号ActiveX控件的创建及应用

    程序名称:取硬盘序列号ActiveX控件的创建及应用 运行环境:win2000/2003 vb6 iis5/6 asp/asp.net

    Excel OCX ActiveX控件

    Excel OCX 是一个功能强大的ActiveX控件,用Visual Basic 6.0编写, (保证最大的兼容性...在Visual Basic应用程序里使用Excel OCX,能把原本需要数周时间开发的工作缩短到几天内完成。控件所有的功能都经过了测试和优化

    全功能ActiveX控件参考手册

    全功能ActiveX控件参考手册,activeX 控件开发参考

    ActiveX控件注册的几种方法

    ActiveX控件注册的几种方法使用Regsvr32.exe程序 对ActiveX控件进行注册

    注册ActiveX控件方法

    ActiveX控件ActiveX控件

    ActiveX控件加载外部dll及html测试Demo

    ActiveX控件加载外部dll及html测试Demo 用VC2010编写,自已测试成功 Test.html为测试ActiveX控件页面 TestDll是dll动态库 Loaddll是测试TestDll的Demo FROMYANTAI为ActiveX控件,加载外部库TestDll,使用VC STL项目

    Shell Controls ActiveX控件

    Shell Controls ActiveX控件 给你的应用程序Windows Explorer添加一些特色。这些强大的shell控件包括ShellComboBox,ShellTreeView和ShellListView。 &lt;br&gt; Shell Controls ActiveX控件 允许你在你的应用程序...

    一个简单的ActiveX控件——详尽教程

    一个简单的ActiveX控件——详尽教程

    使用C_开发ActiveX控件

    使用C_开发ActiveX控件使用C_开发ActiveX控件使用C_开发ActiveX控件

    大华摄像头ActiveX控件(ocx).zip

    大华摄像头ActiveX控件

    网页中显示带控件的ActiveX控件

    网页中显示带控件的ActiveX控件 网页中显示带控件的ActiveX控件 网页中显示带控件的ActiveX控件

    ISAX Gauge ActiveX控件

    ISAX Gauge ActiveX控件 是集成了警报控制能力的图像显示控件。 可以设置变量名,工程单元警报/警告界限和所有颜色等属性。 通过你的应用程序的属性和提示,ISAX Gauge 可以很轻松地产生警报和警告状态。 ...

    VB6.0动态加载ActiveX控件漫谈

    ---- 通过使用动态加载ActiveX控件使用庞大的应用程序变得很小,将不同的 ActiveX控件进行各种组合,使应用程序更加灵活多变,如您的应用系统要处理三十种门禁, 而某个具体的用户可能只有一种或两种门禁,根本没...

Global site tag (gtag.js) - Google Analytics