我正在编写一个Java程序,它使用Jacob library(桥接COM和Java)与Microsoft Outlook进行交互。该程序为用户创建一个新的MailItem,displaying其Inspector窗口。我希望订阅检查员的Close event以了解用户何时完成编辑邮件项目。Java,Jacob和Microsoft Outlook事件:接收“无法找到事件iid”错误
要订阅的情况下,我也跟着在Jacob's documentation指令(约 ⁄ 向下页):
当前[事件]模型是概念性 类似的Visual Basic
WithEvents
构造。基本上,我提供了一种 类称为com.jacob.com.DispatchEvents
具有 一个构造函数源 对象(com.jacob.com.Dispatch
类型)和目标对象 (任何类型的)。源 对象查询其IConnectionPointContainer
接口 和我尝试获得其默认 源接口的IConnectionPoint
(我从IProvideClassInfo
获得)。同时, 我还创建了默认源接口的DISPID的 到 实际方法名称的映射。然后我使用方法名称 从目标Java对象获取jmethodID
句柄。 所有事件方法当前必须有 相同的签名:一个参数,其中 是Variant的Java数组,以及 void返回类型。
这里是我InspectorEventHandler
类,符合雅各布的文档:
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);
不过,最后线路发生故障,但有以下例外:
Exception in thread "main" com.jacob.com.ComFailException: Can't find event iid at com.jacob.com.DispatchEvents.init(Native Method) at com.jacob.com.DispatchEvents.(DispatchEvents.java) at cake.CakeApplication.run(CakeApplication.java:30) at cake.CakeApplication.main(CakeApplication.java:15) couldn't get IProvideClassInfo
According to Google,其他一些人也收到了这个错误。不幸的是,他们中没有人收到答复。
我现在用的是雅各布库,号称防止这个问题的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");
所有这些尝试都失败了与同样的错误。