zoukankan      html  css  js  c++  java
  • Jacob调用COM组件总结,实例

    转自:http://blog.csdn.net/whw6_faye/article/details/5418506

    最近做了一个Java Jacob调用COM组件的东西,其中遇到了不少问题,现在把经验总结一下和大家分享。

    1.Jacob安装

       Google一下,下载Jacob最新版。我这里用的是Jacob-1.15

       把Jacob.jar放到你Java工程的lib目录下,引入项目

       Jacob自带了两个dll, jacob-1.15-M3-x64.dll 和jacob-1.15-M3-x86.dll,把这两个放到C:/Windows/System32下,很多人忘了这一步导致后面调用失败

    2.Jacob使用

       引用Jacob包

    [java] view plaincopy
     
    1. import com.jacob.activeX.*;  
    2. import com.jacob.com.*;  

    (1) COM组件名称

       调用COM组件的时候,很多人都在网上抄来抄去(主要是调用Word),而没有弄明白其中的原理.

       首先,COM组件有一个全局的名称,制作COM组件的时候必须指定,这个名称可以用Windows 2000或Windows 2003的Oleview工具查看到,在Visual Studio中Add reference中看到的是COM组件的描述,不是名称!

       例如

          ActiveXComponent comObj = new ActiveXComponent("Word.Application");

      

       COM组件的名字叫 "Word",而Application是COM组件中实现的一个对象.

       如果自己做一个COM组件叫 A, 里面有一个 ICalc的接口, Calc实现了ICalc接口

       那么应该这么调用: ActiveXComponent comObj = new ActiveXComponent("A.Calc");

    (2)IDispatch

        COM组件中的接口必须派生自 IDispatch, 否则Jacob无法调用!

        我在做一个测试COM组件的时候碰到了这个问题, 我的接口派生自 IUnknown, 所以jacob提示无法找到dispatch interface

        当然,几乎所有的商业COM组件都是实现了IDispatch接口的

    (3)数据类型, 参数

        VB, VC++, Delphi, VS 这样的开发工具都可以创建COM组件,但是数据类型上需要注意.

        Delphi做的COM组件处理字符串一定要使用 WideString类型, 在TypeLib 里需要用 BSTR 或者 BSTR*,

        用LPSTR 或者 LPSTR * (在Delphi里映射为PChar (PAnsiChar)) 做的参数, .NET里可以调,但是Java里用jacob就不行了

        另外参数的 in, out 很关键, 尽量不要用 in,out 这样的参数, 而是 in a, out b 这样

        对于字符串, 如果是out , 那么COM组件中要为这个字符串构造内存空间再设值,    Delphi中 字符串是值类型, 这个一定要注意

       

        GetMem(a, 1000);

        FillChar(a^, 1000, 0);

        StrCopy(......)

       

        jacob中调用的时候,如果要返回字符串,一定要这样写

       

    [java] view plaincopy
     
    1. String str = "";  
    2. Variant v = new Variant(str, true);  
    3. comObj.call("HelloWorld", v);  

        new Variant()的第二个参数,指定是否强制按引用传递 (byref), 对于COM组件中是 out 类型的参数适合用这种

    3. 实际应用

       以上是我总结的一些经验,实际应用没有那么复杂.大部分人就是用jacob来操作Office系列组件而已

       而Word, Excel这样的COM组件包含了很多属性, 所以是 comObj.getProperty (......) 不需要 2 部分那么多注意点

       具体例子就不贴了,操作Word.Excel去google一下,例子很多

       如果你需要调用其他的一些COM组件,那么就要注意第二段的一些注意点

  • 相关阅读:
    Windows Server 2003 SP2(32位) 中文版 下载地址 光盘整合方法
    用Recycle()方法对Java对象的重要性
    Lotus中千奇百怪的 $$
    Developing a simple application using steps "User Decision" and "Mail"(1) 沧海
    沟通中的情绪管理(演讲稿) 沧海
    人只有在压力之下,才可能成功,没做一件事,都必须成功,不许言败 沧海
    什么是IDOC,以及IDOC的步骤 沧海
    VS2008 Professional Edition CHS中的deffactory.dat读取错误 沧海
    Including custom text in the step "User Decision" 沧海
    SAP Upgrade Strategy 沧海
  • 原文地址:https://www.cnblogs.com/x_wukong/p/4273592.html
Copyright © 2011-2022 走看看