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包
- import com.jacob.activeX.*;
- 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中调用的时候,如果要返回字符串,一定要这样写
- String str = "";
- Variant v = new Variant(str, true);
- comObj.call("HelloWorld", v);
new Variant()的第二个参数,指定是否强制按引用传递 (byref), 对于COM组件中是 out 类型的参数适合用这种
3. 实际应用
以上是我总结的一些经验,实际应用没有那么复杂.大部分人就是用jacob来操作Office系列组件而已
而Word, Excel这样的COM组件包含了很多属性, 所以是 comObj.getProperty (......) 不需要 2 部分那么多注意点
具体例子就不贴了,操作Word.Excel去google一下,例子很多
如果你需要调用其他的一些COM组件,那么就要注意第二段的一些注意点
Jacob调用COM组件总结,实例的更多相关文章
- 服务器端调用Word组件读取Word权限、未将对象引用到对象实例终极解决方案
最近因为业务需要,需要在服务器上调用Word组件,结果遇到各种问题,比如检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败 ...
- VS2010调用Com组件
Com组件开发过程中用的不多,资料也不多,故记录开发Com组件中的部分问题. 在这一篇文章里,讲解了如何使用VS2010创建Com组件.现在基于该文章创建的Com组件接口,创建VC++项目来调用该接口 ...
- VC中调用COM组件的方法(转载)
原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...
- vc中调用Com组件的方法详解
vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGet ...
- vue组件之间的通信以及如何在父组件中调用子组件的方法和属性
在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据 一.父组件利用props往子组件传输数据 父组件: <div> < ...
- React 深入系列1:React 中的元素、组件、实例和节点
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...
- vue定义全局方法 调用其他组件的方法
官网的写法 vue实例.$on就可以在根实例上定义全局方法 this.$root就是获取根实例 如果没有根实例 就表示当前实例 this.$root.$on 不需要.eventHub 不需要下面这 ...
- 微信小程序自定义组件的使用以及调用自定义组件中的方法
在写小程序的时候,有时候页面的内容过多,逻辑比较复杂,如果全部都写在一个页面的话,会比较繁杂,代码可读性比较差,也不易于后期代码维护,这时候可以把里面某部分功能抽出来,单独封装为一个组件,也就是通常说 ...
- vue父组件调用子组件资源
通过上篇博文提到的方法我们可以触发子组件的某个事件来实现调用子组件的某些资源(例如数据和方法),但是更多的情况下我们会想不通过触发子组件的事件,而直接调用子组件的资源 这个时候我们就需要用到ref了, ...
随机推荐
- dfs序题目练习
参考博文:http://blog.csdn.net/qwe2434127/article/details/49819975 http://blog.csdn.net/qq_24489717/artic ...
- luogu P1549 棋盘问题(2) 题解
luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...
- 浅谈css中浮动和清除浮动带来的影响
有很多时候,我们都会用到浮动,而我们有时候对浮动只是一知半解,却不是太清楚它到底是怎么回事,不知道各位有没有和我一样的感觉,只知道用它,却不知道它到底是怎么回事,所以,在学习的过程中,就要把一个概念不 ...
- 删除 list 集合中的元素
删除 list 集合中的元素,当删除的元素有多个的时候,只能使用迭代器来删除. 当删除 list 集合中的元素只有一个的时候,有三种方法都可以实现. import java.util.ArrayLis ...
- 【C#】IEnumrator的枚举数和IEnumerable接口
声明IEnumerator的枚举数 要创建非泛型接口的枚举数,必须声明实现IEnumerator接口的类,IEnumerator接口有如下特性: 1.她是System.Collections命名空间的 ...
- 利用gmpy2破解rsa
gmpy2的相关文档: https://gmpy2.readthedocs.io/en/latest/ ================ 题目: 来自实验吧的rsarsa:http://www.shi ...
- CentOS7 安装Python3.6.4
1. 安装依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline- ...
- SpringBoot学习(三)
一.单个 controller 范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotati ...
- Nearest Neighbor Search
## Nearest Neighbor Search ## Input file: standard input Output file: standard output Time limit: 1 ...
- FastReport.Net使用:[15]富文本控件使用
富文本(Rich Text)控件用于显示Rtf格式的文本. 认识富文本编辑窗体 1.下图就是富文本的编辑窗体,乍一看就像Word一样,不过功能没有Word强大了.具体功能就不一一介绍了,用个Word的 ...