JACOB(Java/COM/ActiveX)-如何对事件处理进行故障排除?

JACOB(Java/COM/ActiveX)-如何对事件处理进行故障排除?,java,com,activex,jacob,Java,Com,Activex,Jacob,我正在尝试使用JACOB与COM对象进行交互 我能够调用对象上的初始化方法(并获取其属性),但没有得到任何事件。下面引用了代码。 我有一个示例HTML+Javascript页面(在IE中运行),它成功地接收来自同一对象的事件。 我正在考虑以下选项,但如果有任何具体的故障排除想法,我将不胜感激 将我的Java程序发送给开发COM对象的团队,并 他们会在自己这边寻找任何可疑的东西(对象是否有办法知道是否有客户在监听其事件,以及这些事件是否成功交付?) 进入JACOB的本地部分,试着在那一边调试。有

我正在尝试使用JACOB与COM对象进行交互

我能够调用对象上的初始化方法(并获取其属性),但没有得到任何事件。下面引用了代码。
我有一个示例HTML+Javascript页面(在IE中运行),它成功地接收来自同一对象的事件。
我正在考虑以下选项,但如果有任何具体的故障排除想法,我将不胜感激

  • 将我的Java程序发送给开发COM对象的团队,并 他们会在自己这边寻找任何可疑的东西(对象是否有办法知道是否有客户在监听其事件,以及这些事件是否成功交付?)

  • 进入JACOB的本地部分,试着在那一边调试。有点吓人,因为我的C++生锈了,我从来没有为Windows编程过。
公共静态void main(字符串[]args){ 试一试{ ActiveXComponent c=新的ActiveXComponent( “CLSID:{******-***-***-***-***-***-***-******-************}”);//我的对象的CLSID 如果(c!=null){ System.out.println(“版本:”+c.getProperty(“版本”); InvocationProxy=新的InvocationProxy(){ @凌驾 公共变量调用(字符串方法名,变量[]targetParameters){ System.out.println(“***事件***:”+methodName); 返回null; } }; DispatchEvents de=新的DispatchEvents((Dispatch)c.getObject(),proxy); c、 调用(“Init”,新变量[]{ 新变量(10),//参数1 新变量(2),//参数2 }); System.out.println(“等待事件…”); Thread.sleep(60000);//60秒足够长了 System.out.println(“清理…”); c、 安全释放(); } }捕获(例外e){ e、 printStackTrace(); }最后{ ComThread.Release(); } }
以下是我的具体问题的解决方案:

事实证明,COM对象是作为一个不可见的ActiveX控件编写的,该控件假定它在窗口上下文中运行。这是组件开发团队在我给他们基于JACOB的程序后“发现”的

提供窗口上下文是JACOB似乎没有做的事情


本例中的解决方案是摆脱COM(并使用JNA直接调用本机DLL中的C函数)。

解决获取事件故障的简单方法是打开Jacob调试,方法是使用选项运行java
COM.Jacob.debug=true

java -Dcom.jacob.debug=true ...
所有接收到的事件都显示在标准错误(或输出)上:

java -Dcom.jacob.debug=true ...
Thread-0: InvocationProxy: trying to invoke Change on Sink@882c01f
Thread-0: InvocationProxy: listener (Sink@882c01f) doesn't implement Change