我正在尝试使用 JACOB 与 COM 对象交互。
我能够调用对象的初始化方法(并获取其属性),但没有获取任何事件。代码引用如下。
我有一个示例 HTML+Javascript 页面(在 IE 中运行),它成功接收来自同一对象的事件。
我正在考虑以下选项,但希望有任何具体的故障排除想法......
将我的 Java 程序发送给开发 COM 对象的团队,并获得 他们寻找任何可疑的东西(该对象是否有办法知道是否有客户端正在监听其事件,以及它们是否已成功传递?)
进入 JACOB 的 native 部分并尝试在那一侧进行调试。这有点可怕,因为我的 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(); } }
最佳答案
这是我的具体问题的解决方案:
事实证明,COM 对象被编写为不可见的 ActiveX 控件,假定它在窗口上下文中运行。这是我给组件开发团队提供基于 JACOB 的程序后“发现”的。
JACOB 似乎没有提供窗口上下文。
我们案例中的解决方案是摆脱 COM(并使用 JNA 直接调用 native DLL 中的 C 函数)。
关于java - JACOB (Java/COM/ActiveX) - 如何解决事件处理问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2756776/