续:Java Tomcat 中调用.net DLL的方法 -- Can't get object clsid from progid

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组件我是不懂的,见谅)。

        好了,就到这儿吧,希望对同样是新手的你有点用处。


 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值