【问题标题】:JACOB (Java/COM/ActiveX) - How to troubleshoot event handling?JACOB (Java/COM/ActiveX) - 如何对事件处理进行故障排除?
【发布时间】:2011-02-14 22:52:45
【问题描述】:

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

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

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

  • 进入 JACOB 的本机部分并尝试在该端进行调试。这有点吓人,因为我的 C++ 生锈了,而且我从来没有为 Windows 编程过。

公共静态无效主要(字符串[]参数){ 尝试 { ActiveXComponent c = 新的 ActiveXComponent( "CLSID:{********-****-****-****-************}"); // 我的对象的 clsid 如果(c!= null){ System.out.println("版本:"+c.getProperty("版本")); InvocationProxy 代理 = 新 InvocationProxy() { @覆盖 公共变体调用(字符串方法名,变体[]目标参数){ System.out.println("*** 事件***:" + methodName); 返回空值; } }; DispatchEvents de = new DispatchEvents((Dispatch) c.getObject(), proxy); c.invoke("初始化", new Variant[] { 新变体(10),//参数1 新变体(2),//参数2 }); System.out.println("等待事件..."); 线程.sleep(60000); // 60 秒足够长 System.out.println("正在清理..."); c.safeRelease(); } } 捕捉(异常 e){ e.printStackTrace(); } 最后 { ComThread.Release(); } }

【问题讨论】:

    标签: java com activex jacob


    【解决方案1】:

    这是我的具体问题的解决方案:

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

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

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

    【讨论】:

      【解决方案2】:

      解决获取事件问题的一种简单方法是打开 Jacob 调试,方法是使用选项 com.jacob.debug=true 运行 java:

      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
      

      【讨论】:

        猜你喜欢
        • 2015-12-14
        • 1970-01-01
        • 2012-08-29
        • 2021-02-02
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多