为什么我的Com4J界面在迭代期间挂起?

时间:2013-02-13 14:13:29

标签: java com4j

我必须将第三方COM API连接到Java应用程序。所以我决定使用Com4j,到目前为止我已经满意了,但现在我遇到了一个问题。

运行tlbgen后,我有一个名为IAddressCollection的对象,根据原始API文档,该对象符合IEnum接口定义。该对象提供了iterator()函数,该函数返回java.util.Iterator<Com4jObject>。当我想查找消息的所有地址时,该对象来自另一个名为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 个答案:

答案 0 :(得分: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
 }

很抱歉对此感到烦恼。