2010-01-14 97 views
7

我维护使用Jacob或Java-COM Bridge的传统Java应用程序通过MS VBA和MS Word的COM接口进行调用。我一直在寻找来自Sun的com4j,它看起来很有希望。com4j与jacob从Java调用COM方法

对我来说看起来不错的原因是它使用vtable绑定方法而不是IDispatch。假设所有的COM对象都是我们操作当前的vtable接口的,那么使用它们来代替IDispatch似乎更清晰。早在COM和CORBA使用热二元接口技术的日子里,我似乎记得通过vtable的早期绑定比通过IDispatch的后期绑定提供了更好的性能。

有没有人从Jacob转移到com4j?如果是这样,那么陷阱和经验教训是什么?

回答

13

我已经在对一个简单的COM对象进行集成时使用了Jacob和Com4j。主要是因为雅各泄漏了太多内存,所以我最终选择了与Com4j。与雅各布相比,我认为Com4j一旦建立起来就更加直截了当。如果我没有记错的话,在进行实际的COM呼叫之前,雅各布需要更多的设置和打字。而在Com4j中,您只需使用提供的工厂。

Com4j一直在为我们工作,但我们在路上遇到了一些颠簸。首先,生成的接口没有正确生成,我们需要手动调整它们。我记得的主要问题是我们无法使@ReturnValue注释正常工作。另外,我们需要手动更正枚举的@VTID

我们遇到的另一件大事是我们无法使用Holder(out params)类short s。我们最终将Delphi包装从Integer转换为Short,而不是对Com4j进行任何更改。

最后,我记得当我整合时,我对项目状态有点担心。似乎没有定期更新(自上次维护版本发布后两年)。

+1

谢谢。我不想在没有提供细节的情况下进入雅各布记忆漏洞,但我们也看到了它。我想我会用com4j和雅各布做一个示范项目,亲身体验这些差异。 – 2010-01-14 20:41:51

+0

我正在考虑从com4j转到雅各布,因为不幸的是,com4j只能用于32位Java而不是64位Java,所以在未来的水中似乎死了。 – 2011-03-02 09:15:00

+0

由于@PaulTaylor com4j的评论更新已经[更新为64位Java支持](http://kohsuke.org/2012/04/27/com4j-updates/)。 – 2013-03-25 17:04:17

0

虽然这是一个非常古老的问题,但我也推荐新用户使用Com4j,因为它更稳定,它有一个活跃的社区,甚至还有一个用于生成Java类的Maven插件。但你也可能想看看“j-interop”。