1

我必须将第三方 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 的问题?

4

1 回答 1

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
 }

很抱歉给您带来烦恼。

于 2013-02-14T09:46:00.967 回答