From:http://hi.baidu.com/uniqueness/item/d71912ccc7fd130ac610b235
先使用以下测试代码,判断是否时自己的dll出现问题
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
Dispatch xlo = (Dispatch)(xl.getObject());
try {
System.out.println("version="+xl.getProperty("Version"));
System.out.println("version="+Dispatch.get(xlo, "Version"));
} catch (Exception e) {
e.printStackTrace();
} finally {
xl.invoke("Quit", new Variant[] {});
}
以下是转帖备份
先不得不说,百度搜索技术性质的文档的确比不上GOOGLE来力啊。让人恼火的是Google的搜索总是一不注意就被重置进不了了!不发牢骚了,进入正题,提醒一句,我是个Java新手,如果你也是,可以看看。
想调用dll的,大部分其实是针对已经存在的已注册的dll,我当时就是只是知道这个dll的接口,方法而已,并没有源文件可以去编译。不然的话,我何必还要去调用dll呢,直接用Java写一个类就行了!
第一次搜的结果是JNative比较广泛,可以很久都没有更新了,文档也不是很多。但没有办法啊,用吧。比较郁闷的是,下载完了,看介绍说JNative不支持64位的Java平台,而我当时装环境的时候,脑子一热,结果是装了64位的。咋办啊。重装个32的JDk吧,唉,那个累啊。
准备工作,软件都好了,开始使用吧。嗯,过程我就不说了。当时初始化dll是成功的,但是就是提示找不到该方法,很郁闷。我用vs的OLE/COM 工具查看要调用的DLL,结果结构如下:
....
library MyLibrary {
... ...
interface _Fun1: IDispatch {
HRESULT M_Fun1 ......
HRESULT M_Fun2 ......
};
... ...
coclassMFunction{
[default] interface _Fun1;
};
};
用JNative调用M_Fun1总是不成功,提示找不到方法。因为我也不知道这个组件dll是用什么编译的(我对C/C++不太懂,对Java也是新手),无论是调用 M_Fun1还是FUn1.M_Fun1还是MyLibrary.MFunction.M_Fun1都不成功。棘手了。
没有办法重新找吧,用G搞到了jacob ,好啊,还比较新呢。特别是支持64位的Java。嘿嘿。下最新的 [jacob-1.16],换回64位的JRE。简单配置下,把解压出来的jacob-1.16-x64.dll 放到 64 位JRE下的 bin 文件夹中。在Eclipse项目中【build path】-【configure build path...】,选择【Libraries】,选择【Add External JARs...】,导入jacob.jar 。 嗯,配置好了,但是还是用官网提供的代码测试下,
//========= 下面是测试代码 =========
import com.jacob.com.*;
import com.jacob.activeX.*;
public class DispatchTest {
public static void main(String[] args) {
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
Dispatch xlo = (Dispatch)(xl.getObject());
try {
System.out.println("version="+xl.getProperty("Version"));
System.out.println("version="+Dispatch.get(xlo, "Version"));
} catch (Exception e) {
e.printStackTrace();
} finally {
xl.invoke("Quit", new Variant[] {});
}
}
}
//========= 上面是测试代码 =========
哈哈,出错了。晕,那我还兴奋个啥?!出错信息:Can't find META-INF/JacobVersion.properties。我看了下jar包,的确没那个文件,去官网上查,发现已经有人报告这个错误了。好吧,将 [jacob-1.16]换成 [jacob-1.15],删掉jacob-1.16-x64.dll,拷入jacob-1.15-x64.dl,将前面1.16版本jacob.jar替换为1.15版的jacob.jar。
再来,嘿嘿,成功了。 打印出了结果 version=14.0 version=14.0
到这儿的确给我打了一支兴奋剂!!!现在开始测试我要用的dll,当时dll名称是MFunction.dll ,改成如下代码
public static void main(String[] args) {
ActiveXComponent xl = new ActiveXComponent("MFunction");
try {
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
出错了,“Can't get object clsid from progid”,NND,看来没那么简单啊。说明没创建成功啊(原谅我这个新手吧!)仔细看了下那个成功的测试代码,想了想,难道要用OLE/COM中出现的那个名称?改了试试!
ActiveXComponent xl = new ActiveXComponent("MyLibrary");
还是一样的错误,晕了。当时有点不知所措了,没有办法,只好根据错误提示查查资料了。根据资料上说,progid是一个字符串,在HKey_Classes_Root下,progid下有个CLSID子键,CLSID是全球唯一。于是我在注册表中搜索了下Excel.Application ,果然存在,而且其提供了CLSID。根据错误提示,肯定是我听的要用的dll的progid不对,找不到progid为MyLibrary的项,所有报错了。于是我就搜MyLibrary,嘿,发现了,结果是MyLibrary.MFunction,哈哈,改吧!
public static void main(String[] args) {
ActiveXComponent xl = new ActiveXComponent("MyLibrary.MFunction");
try {
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
结果了,晕了,还是报错,不过这次不一样。“Can't co-create object”,很显然是找到了,但是不能创建。现在咋办???
只有拜托万能的GG了,好在很快就有了结果,其中一个很可能适合我这种情况。原来虽然jacob 支持64位Java平台,但是你要调用的dll也必须为64位的。显然我当时没考虑到那么多,而我用的MFunction.dll 是32位的。恩,恩,有点道理。换平台,换成32位的JRE编译,注意,现在将jacob-1.15-x32.dll 放到 32 位JRE下的 bin 文件夹中哈哈,不枉我这么幸苦,成功了!!!!
//========= 下面是测试代码 =========
import com.jacob.com.*;
import com.jacob.activeX.*;
public class DispatchTest {
public static void main(String[] args) {
ActiveXComponent xl = new ActiveXComponent("MyLibrary.MFunction");
try {
System.out.println("result="+xl.invoke("M_Fun1", "Hello DLL").toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
//========= 上面是测试代码 =========
大功告成了。总结下。
不知道jJacob 1.16版本为什么会出错,不过还是先用1.15版的吧。安装的时候,要分清32位版本的和64位版本的文件。不过还是建议用jacob-1.15-x32.dll。配置如下:将jacob-1.15-x32.dll放入32位JRE的bin文件夹中,在Ecplise中的项目中的Libraries添加jacob.jar。在创建ActiveXComponent的时候要注意用dll的progid,不知??保险的去注册表查查吧。或者用OLE/COM查看你要用的dll信息,格式为library名称.coclass名称,比如我用的MFunction.dll 在OLE/COM中查看其library为MyLibrary,coclass为MFunction,所以就用new ActiveXComponent("MyLibrary.MFunction"),但是这个方法对你的dll不知道是否有效。(对COM组件我是不懂的,见谅)。
好了,就到这儿吧,希望对同样是新手的你有点用处。