JACOB(Java / COM / ActiveX) - 如何解决事件处理问题?

时间:2010-05-03 07:49:29

标签: java com activex jacob

我正在尝试使用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();
    }
}

2 个答案:

答案 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