在使用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有若干个这样的重载函数,比较方便。
本文对比了使用JCOM和Jacob两种方式在Java中调用COM组件的具体实现,并详细介绍了各自的优缺点。Jacob在参数类型支持及使用便捷性上表现更佳。






2432

被折叠的 条评论
为什么被折叠?



