2013-02-13 4 views
1

Мне нужно связать сторонний COM API с Java-приложением. Поэтому я решил использовать Com4j, и до сих пор я был доволен, но теперь у меня возникла проблема.Почему мой интерфейс 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

Хорошо, я ненавижу отвечать на свой вопрос, но в этом случае я нашел проблему. Проблема заключалась в базовом 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 
} 

Так жаль раздражению на этом.

Смежные вопросы