我有一个用VB6开发的COM +组件。
在使用组件服务管理器COM +应用程序注册后,我可以像这样使用ASP
Set Comando = Server.CreateObject("JuiciosComando.clsComando")
ComandoExecute = Comando.execute(Xml)
Set Comando = Nothing
这就是我所需要的,组件只接收一个(可能是一个巨大的)字符串并返回另一个(也可能是巨大的)字符串......
有没有办法从Java访问这个相同的组件?
到目前为止我发现的是J-Integra,但它是商业产品。
我也发现this thread on codeguru.com但我的C ++ .NET知识相当差,而且我宁愿找到一个免费的纯Java解决方案。
答案 0 :(得分:5)
正如Eddie所提到的,你有两种主要方法可以通过java使用COM:使用C ++编写JNI包装器或使用第三方JAR包装COM对象。
我过去曾尝试使用C ++来包装一个COM对象 - 它不适合胆小的人 - 这不容易做到,并且很容易泄漏资源。
我还使用了两个第三方JAR:ComfyJ和JACOB。
ComfyJ非常易于使用,还包含一个codegen实用程序,可以为您的COM类生成java包装类。
可以通过http://www.teamdev.com/comfyj/index.jsf
下载和试用(我不以任何方式与TeamDev有关联!)
如果您迫切需要一个完全免费的解决方案,您也可以尝试JACOB(http://sourceforge.net/projects/jacob-project/)。
我遇到了文档问题,但它相对稳定。
答案 1 :(得分:4)
我可以确认JACOB效果很好。我已经将它用于许多COM自动化项目而没有任何问题。它是免费的......
答案 2 :(得分:2)
我使用的应用程序最初尝试使用JNI与本机代码进行交互以访问COM,但最终维护和调试非常困难。 (幸运的是,我不是应用程序的那部分工作人员!)由于这种经验,我现在建议需要访问COM的Java代码通过编写C#应用程序来进行COM访问,并使用两个应用程序之间的套接字。
与在C#中的等价物相比,JNI在Java中具有不必要的风险和困难,因此从Java执行此操作的最稳定方法是不使用Java。委托COM访问具有COM访问专业知识的东西:C#。您的另一种选择是为您自己管理JNI的第三方库授权。但除非你喜欢痛苦,否则我强烈建议你不要使用自己的JNI解决方案。
稍后添加:正如您在引用的链接中看到的那样,JNI代码可能会导致整个JVM崩溃。至少如果COM访问位于套接字的另一端,如果C#应用程序崩溃,您只会丢失套接字,当C#应用程序返回时,您可以轻松地重新建立该套接字。但是,访问COM时,C#远不太可能崩溃。是的,拥有一个纯粹的100%Java解决方案更好,但有时将任务委托给另一种语言确实要好得多。
答案 3 :(得分:1)
也许你应该尝试com4j,它对我很有用,也支持com事件。您可以在此处找到它:https://com4j.dev.java.net/
答案 4 :(得分:0)
抱歉,我知道这个帖子已经过时了,但j-Interop可以帮助你。
来自 j-interop.org 网站:
“j-Interop是Java开源 实现的库(在LGPL下) DCOM有线协议(MSRPC)来 使Pure的发展, 双向非本地Java 可以互操作的应用程序 任何COM组件。“
干杯, 马特