在使用java 与com 相互调用的方法中采用jacob的方法,比jcom要好用的得多
如下是C++ Com 组件的定义文档 IDL
simpleDll.idl : simpleDll 的 IDL 源 // // 此文件将由 MIDL 工具处理以 // 产生类型库(simpleDll.tlb)和封送处理代码。 import "oaidl.idl"; import "ocidl.idl"; [ object, uuid(F2F1B880-B6EB-44B0-9821-6B5F6DEE7D89), dual, nonextensible, helpstring("ItestDll 接口"), pointer_default(unique) ] interface ItestDll : IDispatch{ [id(1), helpstring("方法returnStr")] HRESULT returnStr([out,retval] BSTR* result); [id(2), helpstring("方法a")] HRESULT a([in] BSTR strin, [out,retval] BSTR* strout); [id(3), helpstring("方法b")] HRESULT b([in] BSTR str1, [in] LONG i3, [out,retval] BSTR* result); [id(4), helpstring("方法c")] HRESULT c([in] BSTR a, [in] BSTR b, [in] BSTR cx, [out,retval] BSTR* ret); [id(5), helpstring("方法d")] HRESULT d([in] LONG a, [out,retval] BSTR* c); [id(6), helpstring("方法e")] HRESULT e([in] SHORT a); [id(7), helpstring("方法f")] HRESULT f([in] SHORT a, [out,retval] LONG* b); [id(8), helpstring("方法g")] HRESULT g([in] DOUBLE a, [out,retval] DOUBLE* d); }; [ uuid(BBAF4F2C-B518-424D-AF18-EB5557EFE8DE), version(1.0), helpstring("simpleDll 1.0 类型库") ] library simpleDllLib { importlib("stdole2.tlb"); [ uuid(1527E009-D95D-4ED6-821C-C58C228424ED), helpstring("testDll Class") ] coclass testDll { [default] interface ItestDll; }; };
JCOM 的调用方式:
import jp.ne.so_net.ga2.no_ji.jcom.IDispatch; import jp.ne.so_net.ga2.no_ji.jcom.ReleaseManager; public class Javacall { static { System.loadLibrary("jcom"); } public static void main(String[] args) { process(null); } public static String process(Object[] o) { ReleaseManager rm = new ReleaseManager(); try { IDispatch vbcom = new IDispatch(rm, "simpleDll.testDll.1"); Double l = 234.00; Double bb =(Double) vbcom.method("g",new Object[]{l}); System.out.println("return: " + bb); } catch (Exception e) { e.printStackTrace(); } finally { rm.release(); } return null; } }
Jacob调用方式:
import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * @author wanggang * @version Dec 30, 2009 */ public class Test { /** * @param args */ public static void main(String[] args) { Dispatch dis = new Dispatch("simpleDll.testDll"); Variant ret = dis.call(dis, "g", 234); System.out.println(ret); Variant ret1 = dis.call(dis, "returnStr"); System.out.println(ret1); Variant ret2 = dis.call(dis, "d",1.0); System.out.println(ret2); /////////// ret2 = dis.call(dis, "e",1111); System.out.println(ret2); ret2 = dis.call(dis, "f",22222); System.out.println(ret2); } }
对于传入类型的支持,对于jcom,由于文档是日文的看的不是很懂,而且,在传入的参数列表中,不能有Long类型,有的话,就被认为是jobject,这很郁闷,还有在参数中同时有short ,string,double 莫名的出错。而且调用的时候必须得传参数对象数组。
而jacob,传入的类型,就没有限制了,甚至接口用的是short 我传long类型的也没有报错,当然,我还没有看超出精度范围的时候是否报错,而且传参的时候,可以用dis.call(dis, "e",1111);看API有若干个这样的重载函数,比较方便。