论坛首页 Java企业应用论坛

java 如何调用com组件接口方法。

浏览 14468 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-13  
pikachu 写道

--! COM事件和SWT/AWT/Swing的事件系统原理类似,但在实现上差别太大了.

说实话,要白手起家把Java和com串起来,问题不在接口,而在于要用c写一堆莫名其妙的东西.


接口是个问题,关键在于事件是异步的,java调C容易,就是虚拟机把执行权交给一段C的代码而已,有比较简单的JNI接口。可异步的事件通知呢?C的代码如何启动一段java的代码回调一个java实例的方法可是个麻烦问题。

现在有这些中间件还好,几行代码可以搞定。如果没有,就只能自己写一个服务程序监听c那边发生的事件,然后通知java这边执行代码,或者用MessageQueue之类的异步机制,要写无数的代码才能搞定。

0 请登录后投票
   发表时间:2007-09-13  
liangwj72:
我现在才明白你所谓的困难是什么,你意思是在c那边启动一个线程异步调用java代码困难?
其实根本不用那么麻烦,也没有你想像的那么麻烦。大体思想是在java中启动一个线程,线程循环调用一个native方法,该方法获取下一个com事件(或者任何其他Windows事件),该方法是阻塞式方法,当没有事件时就处于阻塞状态,当获得一个事件后,只需简单调用你定义的java interface的回调函数就行了。
jdk的源代码中到处是这种例子。SWT源代码也是这样。
0 请登录后投票
   发表时间:2007-09-13  
人家不是用“线程循环调用一个native方法”干的,是用同步锁....
0 请登录后投票
   发表时间:2007-09-13  
线程循环调用native方法获取事件时,当然要用同步锁了,这个是生产者-消费者的典型用例,我只不过是没有进一步说明罢了,以为你明白。
0 请登录后投票
   发表时间:2007-09-13  
rehte 写道
liangwj72:
我现在才明白你所谓的困难是什么,你意思是在c那边启动一个线程异步调用java代码困难?
其实根本不用那么麻烦,也没有你想像的那么麻烦。大体思想是在java中启动一个线程,线程循环调用一个native方法,该方法获取下一个com事件(或者任何其他Windows事件),该方法是阻塞式方法,当没有事件时就处于阻塞状态,当获得一个事件后,只需简单调用你定义的java interface的回调函数就行了。
jdk的源代码中到处是这种例子。SWT源代码也是这样。


COM 事件≠ windows事件.
要接收COM事件,你必须
1创建一个COM对象
2挂到COM的事件连接点上
3处理该死的IDispatch接口
4最后才是处理真正的事件

前面3步要是用VC模板辅助,估计生成个一两百行代码也就够了 

不过liangwj72的问题,用 Observer模式解决就是了
引用
可异步的事件通知呢?C的代码如何启动一段java的代码回调一个java实例的方法可是个麻烦问题。




1 设计一个EventDispatch类
2 作n个Static的XXXEventCallback方法对应你的com事件
3 想办法让你的那些个要处理事件的实例注册到这个EventDispatch里
4 jni里调用EventDispatch 的static方法
5 EventCallback再调用实例的方法


不掺和口水战,下班,回家!!
0 请登录后投票
   发表时间:2007-09-13  
pikachu:
我只是说大致原理,我对M$的COM并不熟悉。按照你提供的信息那就更简单了,在类构造函数初始化时初始化这个COM对象,挂到COM的事件连接点上,在添加事件处理器时使用native方法注册对应的IDispatch接口,并将java处理器句柄传给它,在IDipstatch处理方法中回调java处理器相应的方法就可以了。
0 请登录后投票
   发表时间:2007-09-13  
嗯,刚才没看清你的想法,你的想法是我猜测这些中间件的实现原理中的一种。

这种方法的难点在与要用代码实现在C中间notify一个java那边传过来的锁。事件返回对象的内存管理也很麻烦,C无法释放这些内存,只能由java这边申请内存,然后java自己管理。
0 请登录后投票
   发表时间:2007-09-13  
rehte 写道
pikachu:
我只是说大致原理,我对M$的COM并不熟悉。按照你提供的信息那就更简单了,在类构造函数初始化时初始化这个COM对象,挂到COM的事件连接点上,在添加事件处理器时使用native方法注册对应的IDispatch接口,并将java处理器句柄传给它,在IDipstatch处理方法中回调java处理器相应的方法就可以了。


基本上正解
不过初始化COM需要再native里作,并且要保留jni环境让回掉函数处理.
难点不在于思路,而在于实现细节,内存管理,线程同步,以及不稳定的com环境(谁发明的com这套狗屁东西).
说实话,要我设计两边接口的话,稳妥点我会用xml作参数传递的.处理string总比处理一堆自定义对象稳妥.

好了好了,大家拉拉手,还是好朋友.
0 请登录后投票
   发表时间:2007-09-13  
嗯,麻烦是麻烦了些,但并不是不能实现,思路和方法很多。我见过的就有很多种。
在c中调用对象的notify并不是什么难事,这都是JNI规范中写的明明白白的,我觉得还是内存管理是个麻烦事。AWT很好的解决这一点,而SWT将这个任务交给了开发者,让他们按照谁创建,谁释放的原理来解决。
总之,说java调用com困难,的确是这样。但用jni实现并不是不可能的,有很多方法和思路的。
0 请登录后投票
   发表时间:2007-09-13  
pikachu 写道

不过初始化COM需要再native里作,并且要保留jni环境让回掉函数处理

这个当然。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics