【发布时间】:2011-03-04 10:28:39
【问题描述】:
我正在编写一个使用Jacob library(桥接COM 和Java)与Microsoft Outlook 交互的Java 程序。该程序为用户创建了一个新的MailItem、displaying 其Inspector 窗口。我希望订阅检查员的Close event 以了解用户何时完成对其邮件项目的编辑。
要订阅该活动,我按照Jacob's documentation 中的说明进行操作(关于页面下方的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) 无法获得 IProvideClassInfoAccording to Google,其他一些人也收到此错误。不幸的是,他们都没有收到答复。
我正在使用 Jacob 库的 1.7 版,它声称可以防止此问题:
1.7 版还包括阅读代码 类型库直接来自 天才。这使得工作成为可能 与所有 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");
所有这些尝试都因相同的错误而失败。
【问题讨论】:
标签: java com outlook events jacob