java调用COM组件的几种工具

来源:互联网 发布:线性时间选择算法java 编辑:程序博客网 时间:2024/06/04 00:54
谁说jni搞不定事件通知了?搞不定你列得这几个方案怎么实现的?SWT怎么实现的?只是你不会用罢了。

如果要用java调com,不要用jni,因为jni搞不定com的事件通知 

选择一:商业用途建议用J-Integra for COM。 
优点:稳定,使用简单 
缺点:只有商业版,收费的,贵死。 
取巧的办法:weblogic中带了这套工具,听说weblogic很多盗版的.... 

例如以一个com中有add(int,int)的方法,并有一个事件通知。样例代码如下: 
  1. public class ConnectPointComTest {  
  2.     static {  
  3.         System.setProperty("JINTEGRA_NATIVE_MODE""");  
  4.         System.setProperty("JINTEGRA_COINIT_VALUE""2");  
  5.     }  
  6.   
  7.     public void run() {  
  8.         try {  
  9.             _IDispConnectEventsAdapter evt=new _IDispConnectEventsAdapter();  
  10.             final DispConnect dcon = new DispConnect();  
  11.             dcon.add_IDispConnectEventsListener(evt);  
  12.             dcon.add(145);  
  13.         } catch (IOException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  
  17. }  

dispConn开头的类用J-Integra for COM提供的工具生成的。 
使用起来就象使用普通的java类一样的简单。 

选择二: JACOB - Java COM Bridge 
优点:开源,免费的,效果高 
缺点:超过10个并发就死翘翘了,代码不好看。 

同样是上面的那个com,样例代码: 
  1. public void run() {  
  2.     Dispatch test = new Dispatch("MyCOM.Test");  
  3.     MyCOMEvent myCOMEvent = new MyCOMEvent();  
  4.     DispatchEvents de = new DispatchEvents(test, myCOMEvent);  
  5.      Dispatch.call(test, "Add",90,68);  
  6.     Variant ret = Dispatch.call(test, "Sum"36);  
  7.   
  8.     de.safeRelease();  
  9.     test.safeRelease();  
  10. }  

可以看到jacob的调用方式,类似与我们通过反射方式获得实例的方法,然后在调用方法的过程。麻烦啊 

选择三:Jacozoom 
优点:使用方法和J-Integra for COM类似,一样的简单 
缺点:和jacob一样的不稳定,仅仅是稍微好点,并发超过20个才崩溃,收费的。 
样例代码懒得写了。 

评价 

没事就不要用java调com,再简单的代码也简单不错用c#调com,而且效率很有问题,调用10万次后计算出平均每次调用时间为1.7毫秒,这个效率实在太低了。


成功的解决了Weblogic下调用JCOM的问题 

转自(http://blog.sina.com.cn/s/blog_7250360c0100lhme.html)

因为项目需要,在应用中需要调用J-integra公司的Java for COM组件,可惜贵的要死,一个Server Lisence居然要4000多美金,这个问题一度让我很头痛,因为在大陆地区,该公司还没有代理机构,所有的商谈都需要通过英文邮件来和老外交涉,可怜我半生的英语实在难以应付。
 
一个偶然的机会,我发现Weblogic居然已经集成了该组件,但是不敢肯定是否还需要得到J-integra公司的授权才可以使用,事实上,在我初步写的一个范例中也报出了需要一个合法的License 的错误,这一度让我产生了错误的判断,是否仅仅是因为Weblogc公司基于商业合作的需要,打包了该组件而已。而和BEA工程师的几通电话似乎也印证了我的这个判断是正确的,因为BEA的工程师居然对这个也不是很了解,随便给我仍了个英文网站让我自己去看。
 
不过还好,在我看过http://edocs.bea.com/wls/docs103/jcom/index.html和j-integra的Konwlege Base后,我确定,Weblogic应该已经集成了该工具,且不需要经过J-integra的授权,也就是说,即使我使用J-integra的最新版本,Lisence也是可以被忽视的。下面是(如何使Weblogic使用你安装的J—integera版本而不是自带的版本)的步骤
 
1、在Weblogic的Server->protocol选项卡里打开enable JCOM选项。也可以勾选那个“..log” 选项,注意没用的不要打勾,特别是其中一个本地调用的选项,如果打了勾极可能会造成Weblogic无法启动。

2、在WLS 10.0版本里,在startWebLogic.cmd文件中,需要增加下面红色标注的内容:

 
@REM Call setDomainEnv here. set DOMAIN_HOME=C:\BEA\wlserver_10.0\samples\domains\wl_server for %%i in ("%DOMAIN_HOME%") do set DOMAIN_HOME=%%~fsi call "%DOMAIN_HOME%\bin\setDomainEnv.cmd" %* set SAVE_JAVA_OPTIONS=%JAVA_OPTIONS% set SAVE_CLASSPATH=%CLASSPATH% @REM Start PointBase set PB_DEBUG_LEVEL=3 if "%POINTBASE_FLAG%"=="true" ( call "%WL_HOME%\common\bin\startPointBase.cmd" -port=%POINTBASE_PORT% -debug=%PB_DEBUG_LEVEL% -console=false -background=true -ini=%DOMAIN_HOME%\pointbase.ini>"%DOMAIN_HOME%\pointbase.log" 2>&1 ) set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS% set SAVE_JAVA_OPTIONS= set CLASSPATH=%SAVE_CLASSPATH% set SAVE_CLASSPATH= if "%PRODUCTION_MODE%"=="true" ( set WLS_DISPLAY_MODE=Production ) else ( set WLS_DISPLAY_MODE=Development ) if NOT "%WLS_USER%"=="" ( set JAVA_OPTIONS=%JAVA_OPTIONS% -Dweblogic.management.username=%WLS_USER% ) if NOT "%WLS_PW%"=="" ( set JAVA_OPTIONS=%JAVA_OPTIONS% -Dweblogic.management.password=%WLS_PW% )set JINTEGRA_HOME=C:\Program Files\J-Integra\COM set CLASSPATH=%JINTEGRA_HOME%\lib\jintegra.jar;%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSPATH%set PATH=%JINTEGRA_HOME%\bin;%PATH% echo . echo . echo JAVA Memory arguments: %MEM_ARGS% echo . echo WLS Start Mode=%WLS_DISPLAY_MODE% echo . echo CLASSPATH=%CLASSPATH% echo . echo PATH=%PATH% echo . echo *************************************************** echo * To start WebLogic Server, use a username and * echo * password assigned to an admin-level user. For * echo * server administration, use the WebLogic Server * echo * console at http:\\hostname:port\console * echo *************************************************** @REM Set up IP Migration related variables. @REM Set interface name. if NOT "%Interface%"=="" ( set IFNAME=%Interface% ) else ( set IFNAME= ) @REM Set IP Mask. if NOT "%NetMask%"=="" ( set IPMASK=%NetMask% ) else ( set IPMASK= ) @REM Perform IP Migration if SERVER_IP is set by node manager. if NOT "%SERVER_IP%"=="" ( call "%WL_HOME%\common\bin\wlsifconfig.cmd" -addif "%IFNAME%" "%SERVER_IP%" "%IPMASK%" ) @REM START WEBLOGIC echo starting weblogic with Java version: %JAVA_HOME%\bin\java %JAVA_VM% -version f "%WLS_REDIRECT_LOG%"=="" ( echo Starting WLS with line: echo %JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% -Dweblogic.Name=%SERVER_NAME% -Djava.security.policy=%WL_HOME%\server\lib\weblogic.policy %PROXY_SETTINGS% %SERVER_CLASS% %JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% -Dweblogic.Name=%SERVER_NAME% -Djava.security.policy=%WL_HOME%\server\lib\weblogic.policy %PROXY_SETTINGS% %SERVER_CLASS% ) else ( echo Redirecting output from WLS window to %WLS_REDIRECT_LOG% %JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% -Dweblogic.Name=%SERVER_NAME% -Djava.security.policy=%WL_HOME%\server\lib\weblogic.policy %PROXY_SETTINGS% %SERVER_CLASS%>"%WLS_REDIRECT_LOG%" 2>&1 ) echo CLASSPATH=%CLASSPATH% echo PATH=%PATH% echo WEBLOGIC_CLASSPATH=%WEBLOGIC_CLASSPATH% CALL :stopAll popd @REM Exit this script only if we have been told to exit. if "%doExitFlag%"=="true" ( exit ) ENDLOCAL
这么做的主要目的是确保调用最新的 J-integra版本,忽视WLS自带的版本。
3、使用regsvr32注册要调用的COM组件,假如没有注册过的话。
4、若在调用时出现:AutomationException: 0x80040154 - Class not registered
的错误,使用J-integra提供的SetDllHost命令将该DLL注册一下,注册格式是:SetDllHost dllname “description”
注册后,该问题顺利解决。该命令在J-integra的安装目录的bin目录下。


0 0