转自: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包

  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中调用的时候,如果要返回字符串,一定要这样写

  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组件,那么就要注意第二段的一些注意点

Jacob调用COM组件总结,实例的更多相关文章

  1. 服务器端调用Word组件读取Word权限、未将对象引用到对象实例终极解决方案

    最近因为业务需要,需要在服务器上调用Word组件,结果遇到各种问题,比如检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败 ...

  2. VS2010调用Com组件

    Com组件开发过程中用的不多,资料也不多,故记录开发Com组件中的部分问题. 在这一篇文章里,讲解了如何使用VS2010创建Com组件.现在基于该文章创建的Com组件接口,创建VC++项目来调用该接口 ...

  3. VC中调用COM组件的方法(转载)

    原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...

  4. vc中调用Com组件的方法详解

    vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGet ...

  5. vue组件之间的通信以及如何在父组件中调用子组件的方法和属性

    在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据 一.父组件利用props往子组件传输数据 父组件: <div> < ...

  6. React 深入系列1:React 中的元素、组件、实例和节点

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...

  7. vue定义全局方法 调用其他组件的方法

    官网的写法  vue实例.$on就可以在根实例上定义全局方法 this.$root就是获取根实例  如果没有根实例 就表示当前实例 this.$root.$on 不需要.eventHub 不需要下面这 ...

  8. 微信小程序自定义组件的使用以及调用自定义组件中的方法

    在写小程序的时候,有时候页面的内容过多,逻辑比较复杂,如果全部都写在一个页面的话,会比较繁杂,代码可读性比较差,也不易于后期代码维护,这时候可以把里面某部分功能抽出来,单独封装为一个组件,也就是通常说 ...

  9. vue父组件调用子组件资源

    通过上篇博文提到的方法我们可以触发子组件的某个事件来实现调用子组件的某些资源(例如数据和方法),但是更多的情况下我们会想不通过触发子组件的事件,而直接调用子组件的资源 这个时候我们就需要用到ref了, ...

随机推荐

  1. UVA 11624 Fire!(两次BFS+记录最小着火时间)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. python selenium自动化测试之路(1)--分层测试概念、selenium工具介绍

    1.分层自动化测试概念 传统的自动化市场更关注产品UI层的自动化测试,而分层的自动化测试倡导产品开发的不同阶段都需要自动化测试 大多公司与研发团队其实是忽略了单元测试与集成测试阶段的自动化测试工作,所 ...

  3. Vim文本编辑命令

    Vim Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.[1]  VIM是自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来 ...

  4. 458. Poor Pigs

    There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. Th ...

  5. vue js moment.js 过滤了双休日和法定节假日

    源码:注!原创的!!!! <template> <div id="DATE"> <ul class="dateForm" @cha ...

  6. Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5492298.html 在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习 ...

  7. Wannafly挑战赛7 B - codeJan与旅行

    题目描述 codeJan 非常喜欢旅行.现在有 n 个城市排在一条线上,并且 codeJan 的位置不和任何一个城市的位置重叠.codeJan 想要游览 m 个城市,同时因为时间是不断变化的,游览一个 ...

  8. 洛谷P3457 [POI2007]POW-The Flood [并查集,模拟]

    题目传送门 pow 题意翻译 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方形,地图上已经标注了它的海拔高度以及它是 ...

  9. google::proto::message.h

    整了一阵子google  proto message.h, 遇到很多问题,各种百度.google ,估计是用的人不是很多,整的焦头烂额,很多API都不知道该怎么用,只能一点一点的扣,为了方便在这里先简 ...

  10. 从Mybatis的视角去看Bean的初始化流程

    不涉及Spring完整的启动流程,仅仅从Mybatis的视角去分析几个关键的方法,找到Mybatis是如何通过这几个扩展点植入进去的,反过来看Spring是如何设计,埋下这些伏笔,实现其可扩展性. s ...