0

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

2 回答 2

1

解决获取事件问题的一种简单方法是打开 Jacob 调试,方法是运行带有选项的 java com.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
于 2012-10-13T08:43:27.110 回答
1

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

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

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

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

于 2010-05-07T11:05:19.677 回答