我正在编写一个使用Jacob 库(桥接 COM 和 Java)与 Microsoft Outlook 交互的 Java 程序。这个程序创建了一个新的MailItem,向用户显示它的Inspector窗口。我希望订阅检查员的Close 事件,以了解用户何时完成对其邮件项目的编辑。
要订阅该活动,我按照Jacob 文档中的说明进行操作(大约在页面下方2 ⁄ 3处):
当前的 [event] 模型在概念上类似于 Visual Basic
WithEvents
构造。基本上,我提供了一个名为的类com.jacob.com.DispatchEvents
,它有一个构造函数,它接受一个源对象(类型com.jacob.com.Dispatch
)和一个目标对象(任何类型)。查询源对象的IConnectionPointContainer
接口,我尝试IConnectionPoint
为其默认源接口(我从 获取IProvideClassInfo
)获取一个。同时,我还创建了默认源接口的 DISPID 到实际方法名称的映射。jmethodID
然后,我使用方法名称从目标 Java 对象 获取句柄。当前所有事件方法都必须具有相同的签名:一个参数是一个 Java 变量数组,以及一个 void 返回类型。
这是我的InspectorEventHandler
课程,符合 Jacob 的文档:
public class InspectorEventHandler {
public void Activate(Variant[] arguments) {
}
public void BeforeMaximize(Variant[] arguments) {
}
public void BeforeMinimize(Variant[] arguments) {
}
public void BeforeMove(Variant[] arguments) {
}
public void BeforeSize(Variant[] arguments) {
}
public void Close(Variant[] arguments) {
System.out.println("Closing");
}
public void Deactivate(Variant[] arguments) {
}
public void PageChange(Variant[] arguments) {
}
}
以下是我使用此类订阅事件的方式InspectorEventHandler
:
Object outlook = new ActiveXComponent("Outlook.Application");
Object mailItem = Dispatch.call(outlook, "CreateItem", 0).getDispatch();
Object inspector = Dispatch.get(mailItem, "GetInspector").getDispatch();
InspectorEventHandler eventHandler = new InspectorEventHandler();
// This supposedly registers eventHandler with the inspector
new DispatchEvents((Dispatch) inspector, eventHandler);
但是,最后一行失败,但出现以下异常:
线程“主”com.jacob.com.ComFailException 中的异常:找不到事件 iid 在 com.jacob.com.DispatchEvents.init(本机方法) 在 com.jacob.com.DispatchEvents.(DispatchEvents.java) 在 cake.CakeApplication.run(CakeApplication.java:30) 在 cake.CakeApplication.main(CakeApplication.java:15) 无法获得 IProvideClassInfo
据谷歌称,其他一些人也收到了这个错误。不幸的是,他们都没有收到答复。
我正在使用 Jacob 库的 1.7 版,它声称可以防止这个问题:
1.7 版还包括直接从 progid 读取类型库的代码。这使得处理所有 Microsoft Office 应用程序事件以及 IE5 事件成为可能。有关示例,请参见 samples/test/IETest.java 示例。
我注意到上述IETest.java
文件订阅了这样的事件:
new DispatchEvents((Dispatch) ieo, ieE,"InternetExplorer.Application.1");
因此,我尝试以类似的方式订阅我的活动:
new DispatchEvents((Dispatch) inspector, eventHandler, "Outlook.Application");
new DispatchEvents((Dispatch) inspector, eventHandler, "Outlook.Application.1");
new DispatchEvents((Dispatch) inspector, eventHandler, "Outlook.Application.12");
所有这些尝试都因相同的错误而失败。