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了, ...
随机推荐
- 小程序canvasu真机上数据图片不能使用
canvas遇到的坑 1.文字换行 2.真机不能使用网络数据图片(真坑) 点击显示效果我就不写了,你们可以自己加一下 全部代码贴出来 css #preview { width: 100%; heigh ...
- [翻译]HLS实践
最近公司项目没事做,课余实践研究一下技术,算是积累,也可以用到项目里,从零开始记录 HLS:Http Live Streaming 官方文档 https://developer.apple.com/s ...
- tornado中的cookie
1. cookie与session的区别: Session:通过在服务器端记录用户信息从而来确认用户身份,保存在服务器上,每个用户会话都有一个对应的session Cookie:通过在客户端记录信息确 ...
- javascript 进制转换(2进制、8进制、10进制、16进制之间的转换)
//十进制转其他 var x=110; alert(x); alert(x.toString(8)); alert(x.toString(32)); alert(x.toString(16)); // ...
- 【WPF】WriteableBitmap和BitmapImage的相互转换
public BitmapImage ConvertWriteableBitmapToBitmapImage(WriteableBitmap wbm) { BitmapImage bmImage = ...
- 2017-2018-1 20179202《Linux内核原理与分析》第四周作业
一.跟踪分析内核的启动过程实验 : 1.启动Menuos: qemu仿真kernel: qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd ...
- JAVA编程思想读书笔记(四)--对象的克隆
接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...
- STL容器 -- Set
核心: set 是一个数学含义上的集合-----保证了每个数的确定性, 互异性, 不仅如此, set 中的元素还是有序的. 头文件: #include <set> 拓展:由于 set 内的 ...
- 爱奇艺全国高校算法大赛初赛A
$01$背包. 数据范围:物品个数小于等于$3000$,背包大小小于等于$1000000$. $map<int,long long>dp$,用$map$去做$dp$,可以少遍历很多状态,可 ...
- Python类总结-描述符__get__(),__set__(),__delete__()
1 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),set(),delete()中的一个,这也被称为描述符协议 get():调用一个属性时,触发 set():为一 ...