我正在編寫一個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");
所有這些嘗試都失敗了與同樣的錯誤。