2013-02-13 79 views
1

我必須將第三方COM API接口到Java應用程序中。所以我決定使用Com4j,到目前爲止我一直很滿意,但現在我遇到了一個問題。爲什麼我的Com4J界面在迭代期間掛起?

運行後tlbgen我有一個對象叫做IAddressCollection,它根據原始API文檔符合IEnum接口定義。該對象提供返回java.util.Iterator<Com4jObject>iterator()函數。當我想要查找消息的所有地址時,該對象來自另一個名爲IMessage的對象。所以,我希望的代碼是這樣工作的:

IAddressCollection adrCol = IMessage.getAddressees(); 
Iterator<Com4jObject> adrItr = adrCol.iterator(); 
while(adrItr.hasNext()){ 
     Com4jObject adrC4j = adrItr.next(); 
     // normally here I would handle the queryInterface 
     // and work with the rest of the API 
} 

我的問題是,當我嘗試adrItr.next()什麼也沒有發生,代碼將停止工作,但掛起。沒有例外,我通常不得不通過任務管理器殺死它。所以我想知道這是一個與Com4j常見的問題,還是我處理這個錯誤,或者它可能是API的問題?

回答

1

好吧,我討厭回答我自己的問題,但在這種情況下,我發現了這個問題。這個問題是底層API。 IAddressCollection使用基於1的索引,而不是基於我預期的0。它沒有在API文檔中提供這些信息。有一個item功能,在那裏我可以拉的對象這樣的,這樣我就可以

IAddressCollection adrCol = IMessage.getAddressees(); 
for(int i = 1; i <= adrCol.count(); i++){ 
     IAddress adr = adrCol.item(i); 
     // IAddress is the actual interface that I wanted and this works 
} 

很抱歉處理該問題上的這個煩惱。