用Java设计COM客户
此刻,让我们转到另一侧,并用Java开拓一个COM客户。这个措施会挪用系统已安装的COM处事器内的处事。就今朝这个例子来说,我们利用的是在前一个例子里为处事器实现的一个客户。尽量代码在Java措施员的眼中看起来较量熟悉,但在幕后产生的一切却并不寻常。本例利用了用Java写成的一个处事器,但它可应用于系统内安装的任何ActiveX控件、ActiveX Automation处事器可能ActiveX组件——只要我们有一个范例库。
首先,我们将Jactivex东西应用于处事器的范例库。Jactivex有一系列选项和开关可供选择。但它最根基的形式是读取一个范例库,并生成Java源文件。这个源文件生存于我们的windows/java/trustlib目次中。通过下面这行代码,它应用于为外部COM Automation处事器生成的范例库:
jactivex /javatlb JavaAdder.tlb
Jactivex完成今后,我们再来看看本身的windows/java/trustlib目次。此时可在个中看到一个新的子目次,名为javaadder。这个目次包括了用于新包的源文件。这是在Java里与范例库的成果差不多的一个库。这些文件需要利用Microsoft编译器的专用引导呼吁:@com。jactivex生成多个文件的原因是COM利用多个实体来描写一个COM处事器(另一个原因是我没有对MIDL文件和Java/COM东西的利用举办细致的调解)。
名为Adder.java的文件等价于MIDL文件中的一个coclass引导呼吁:它是对一个COM类的声明。其他文件则是由处事器展现出来的COM接口的Java等价物。这些接口(好比Adder_DispatchDefault.java)都属于“遣送”(Dispatch)接口,属于Automation节制器与Automation处事器之间的相同机制的一部门。Java/COM集成特性也支持双接口的实现与利用。可是,IDispatch和双接口的问题已超出了本附录的范畴。
在下面,各人可看到对应的客户代码。第一行只是导入由jactivex生成的包。然后建设并利用COM Automation处事器的一个实例,就象它是一个原始的Java类那样。请留意行内的范例模子,个中“例示”了COM工具(即生成并挪用它的一个实例)。这与COM工具模子是一致的。在COM中,措施员永远不会获得对整个工具的一个引用。相反,他们只能拥有对类内实现的一个或多个接口的引用。
“例示”Adder类的一个Java工具今后,就相当于指示COM激活处事器,并建设这个COM工具的一个实例。但我们随后必需指定本身想利用哪个接口,在由处事器实现的接口中挑选一个。这正是范例模子完成的事情。这儿利用的是“默认遣送”接口,它是Automation节制器用于同一个Automation处事器通信的尺度接口。欲相识这方面的细节,请参考由Ibid编著的《Inside COM》。请留意激活处事器并选择一个COM接口是何等容易!
import javaadder.*; public class JavaClient { public static void main(String [] args) { Adder_DispatchDefault iAdder = (Adder_DispatchDefault) new Adder(); iAdder.setAddend(3); iAdder.sum(); iAdder.sum(); iAdder.sum(); System.out.println(iAdder.getResult()); } }
此刻,我们可以编译它,并开始运行措施。
1. com.ms.com包
com.ms.com包为COM的开拓界说了数量浩瀚的类。它支持GUID的利用——Variant(变体)和SafeArray Automation(安详数组自动)范例——能与ActiveX控件在一个较深的条理打交道,并可节制COM异常。
由于篇幅有限,这里不行能涉及所有这些主题。但我想着重强调一下COM异常的问题。按照类型,险些所有COM函数城市返回一个HRESULT值,它汇报我们函数挪用是否乐成,以及失败的原因。但若调查处事器和客户代码中的Java要领签名,就会发明没有HRESULT。相反,我们用函数返回值从一些函数哪里取回数据。“虚拟机”(VM)会将Java气势气魄的函数挪用转换成COM气势气魄的函数挪用,甚至包罗返回参数。但假使我们在处事器里挪用的一个函数在COM这一级失败,又会在虚拟机里呈现什么工作呢?在这种环境下,JVM会认为HRESULT值符号着一次失败,并会发生类com.ms.com.ComFailException的一个固有Java异常。这样一来,我们就可用Java异常节制机制来打点COM错误,而不是查抄函数的返回值。
如欲深入相识这个包内包括的类,请参考微软公司的产物文档。