最近做了一个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) 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中调用的时候,如果要返回字符串,一定要这样写
new Variant()的第二个参数,指定是否强制按引用传递 (byref), 对于COM组件中是 out 类型的参数适合用这种
3. 实际应用
以上是我总结的一些经验,实际应用没有那么复杂.大部分人就是用jacob来操作Office系列组件而已
而Word, Excel这样的COM组件包含了很多属性, 所以是 comObj.getProperty (......) 不需要 2 部分那么多注意点
具体例子就不贴了,操作Word.Excel去google一下,例子很多
如果你需要调用其他的一些COM组件,那么就要注意第二段的一些注意点
分享到:
相关推荐
总之,Java通过JACOB调用C++ COM组件是一种跨语言集成的有效方式,它允许Java应用利用C++组件的功能。尽管涉及到JNI和对底层细节的理解,但通过JACOB库,这一过程变得相对简单和直观。在实际项目中,确保正确处理...
接下来,在Java端,使用JACOB调用这个COM组件。引入必要的JACOB库后,创建`Dispatch`对象,传入COM组件的ProgID(在本例中是"MathProj.Math"),然后通过`Dispatch.call`方法调用COM组件的方法,如`Add`和`Mult`,并...
在Java中调用COM组件,可以利用Java的JNI(Java Native Interface)或者第三方库如JACOB(Java Advanced COM Bridge)来实现。 **一、JACOB库的介绍** JACOB是一个Java库,它允许Java程序直接调用COM组件,无需通过...
以下是一些关于如何使用Jacob调用C++ COM组件的关键知识点: 1. **Jacob库的安装**:首先,你需要下载Jacob库的jar文件,并将其添加到Java项目的类路径中。同时,还需要提供对应的dll文件,通常是`jacob.dll`,将其...
总结来说,使用Jacob调用COM组件转换Excel为PDF是一种可行的方法,尤其适用于Java开发者。但是,这种方法可能受到系统环境的限制,并且在处理大量文件或高并发场景时可能性能较低。对于更复杂的转换需求,可以考虑...
jacob调用自定义宏实现Java对Word的完美操作 jacob是一个Java-COM桥接器,允许Java程序与COM组件进行交互。在这个示例中,我们使用jacob来调用Word的自定义宏,实现Java对Word的完美操作。 标题: jacob调用自定义...
Java Jacob调用AutoCAD读取文件是一种常见的技术实践,它允许开发者通过Java程序与AutoCAD进行交互,实现对DWG或DXF等AutoCAD文件的读取操作。Jacob(Java和COM的桥梁)是一个Java库,它使得Java应用程序能够直接...
java使用jacob包,调用VS2010编译的COM动态库 其中,包括如下信息: 1、jacob支持JDK1.6、1.7、1.8,支持win32、win64 2、附带有调用COM的java示例 3、运行run.bat,将测试示例一键打包,并同时输出测试结果(实例中...
在描述中提到的"主要涵盖jacob调用ocx控件的方法以及事件的源码demo"部分,你可以期待看到以下内容: 1. **方法调用**:源码中会展示如何使用Jacob的`ActiveX Invoker`类来调用OCX控件的方法。这通常涉及到创建`...
JACOB(Java COM Bridge)是一个用Java编写的COM自动化的桥接库,允许Java程序调用和控制微软COM组件,如Word、Excel和Outlook等。通过JACOB,Java开发人员可以创建和操作Word文档,执行宏命令,甚至将Word文档转换...
然后,通过`newActiveXComponent()`创建一个ActiveX组件实例,并传入之前获取的控件名。之后,就可以通过Dispatch接口操作COM组件的属性和方法了。 代码示例中,首先创建了一个名为`xl`的`ActiveXComponent`实例,...
总结起来,Java Jacob库为Java开发者提供了一种调用Windows COM组件的能力,使得在Java中实现打印Word文档成为可能。通过理解Jacob的工作原理,掌握相关API的使用,开发者可以构建高效、可靠的自动化打印解决方案。
Java调用OCX控件是跨平台编程中的一项技术挑战,因为OCX(Object Linking and Embedding Control)是微软Windows环境下的组件对象模型(COM)控件。然而,通过第三方库如Jacob(Java和COM的桥梁),Java开发者能够在...
首先,jacob是一个开源的Java库,它为Java程序员提供了一个接口,使得可以在Java代码中调用COM组件,例如Microsoft Office套件中的Word。这使得开发者能够利用Java编程语言实现对Word文档的操作,如读取、写入和格式...
当Java通过Jacob调用这些DLL时,实际上是调用了VB中的特定函数,实现特定的功能,例如读写Excel文件或操作Word文档。 4. 操作Excel和Word:在Windows环境中,Microsoft Office提供了丰富的COM接口供其他程序调用,...
COM是一种二进制标准,定义了组件如何暴露接口,以及如何通过接口调用组件的方法。COM组件不依赖特定的编程语言,因为它们通过接口进行通信,接口是由一组纯虚拟函数组成的抽象类。这意味着C++、VB、Java等不同语言...
3. **使用JACOB**:在Java代码中,导入JACOB的相关类,如`com.jacob.activeX.ActiveXComponent`,然后创建ActiveXComponent实例,通过该实例调用COM对象的方法。 4. **文档操作**:例如,如果要将Word文档转换为PDF...
Jacob是一个开源项目,它的主要目标是为Java开发者提供一个方便的方式来调用COM组件和Windows API。通过Jacob,Java代码可以无缝地与Windows操作系统交互,包括访问ActiveX控件,这在处理文字转语音任务时非常有用,...
首先,JACOB全称为Java COM Bridge,是一个用于在Java程序中调用Windows COM组件的开源库。它通过JNI(Java Native Interface)提供了一种方式,使得开发者能够在Java应用中直接操作COM对象,例如Microsoft的Text To...
总结起来,Java操作COM组件是跨平台开发中的一种重要技术,JACOB作为其中的关键工具,使得Java开发者能够利用.NET Framework中的COM组件,扩大了Java的应用范围。通过理解并熟练掌握JACOB的使用,Java程序员可以在...