我正在尝试使用JACOB与COM对象进行交互。
我能够在对象上调用初始化方法(并获取其属性),但是没有得到任何事件。代码引用如下 我有一个示例HTML + Javascript页面(在IE中运行),它成功地从同一个对象接收事件 我正在考虑以下选项,但不胜感激任何具体的故障排除方法......
将我的Java程序发送给开发COM对象的团队,并拥有 他们寻找任何可疑的东西(对象是否有办法知道是否有客户听取其事件,以及他们是否成功交付?)
进入JACOB的本机部分并尝试在那一侧进行调试。鉴于我的C ++生锈并且我从未为Windows编程,这有点可怕。
public static void main(String[] args) { try { ActiveXComponent c = new ActiveXComponent( "CLSID:{********-****-****-****-************}"); // My object's clsid if (c != null) { System.out.println("Version:"+c.getProperty("Version")); InvocationProxy proxy = new InvocationProxy() { @Override public Variant invoke(String methodName, Variant[] targetParameters) { System.out.println("*** Event ***: " + methodName); return null; } }; DispatchEvents de = new DispatchEvents((Dispatch) c.getObject(), proxy); c.invoke("Init", new Variant[] { new Variant(10), //param1 new Variant(2), //param2 }); System.out.println("Wating for events ..."); Thread.sleep(60000); // 60 seconds is long enough System.out.println("Cleaning up ..."); c.safeRelease(); } } catch (Exception e) { e.printStackTrace(); } finally { ComThread.Release(); } }
答案 0 :(得分:1)
以下是我特定问题的解决方案:
事实证明,COM对象是作为一个不可见的ActiveX控件编写的,它假设它在窗口的上下文中运行。在我给他们基于JACOB的程序之后,组件的开发团队“发现了这个”。
提供窗口上下文是JACOB似乎没有做的事情。
我们的解决方案是摆脱COM(并使用JNA直接调用本机DLL中的C函数)。
答案 1 :(得分:1)
通过使用选项com.jacob.debug=true
运行java,解决获取事件的简单方法是打开Jacob调试:
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