com4j против jacob для вызова методов COM из Java

Я поддерживаю устаревшее приложение Java, которое использует Jacob или мост Java-COM для совершения вызовов через COM-интерфейсы MS VBA и MS Word. Я смотрел на com4j от Sun, и он выглядит многообещающе.

Причина, по которой мне это кажется хорошим, заключается в том, что он использует привязку vtable к методам вместо IDispatch. Предполагая, что все COM-объекты, которыми мы манипулируем, имеют интерфейсы vtable, кажется более правильным использовать их вместо IDispatch. В те дни, когда COM и CORBA использовали технологии горячего двоичного интерфейса, я, кажется, помню, что раннее связывание через vtable давало лучшую производительность, чем позднее связывание через IDispatch.

Кто-нибудь мигрировал с Якова на com4j? Если да, то какие подводные камни и уроки были извлечены?


person Stephen Harmon    schedule 14.01.2010    source источник


Ответы (2)


Я использовал как Jacob, так и Com4j при интеграции с простым COM-объектом. В итоге я остановился на Com4j, главным образом потому, что Джейкоб потерял слишком много памяти. По сравнению с Джейкобом, я думаю, что Com4j был более простым после настройки. Если я правильно помню, Джейкобу потребовалось гораздо больше настроек и ввода, прежде чем выполнять реальный COM-вызов. В то время как в Com4j вы будете просто использовать предоставленную фабрику.

Com4j работает нормально для нас, но мы столкнулись с несколькими проблемами на этом пути. Во-первых, сгенерированные интерфейсы были сгенерированы неправильно, и нам нужно было вручную их настроить. Основные проблемы, которые я помню, заключались в том, что мы не могли заставить аннотацию @ReturnValue работать должным образом. Кроме того, нам нужно было вручную исправить перечисление @VTID.

Еще одна важная проблема, с которой мы столкнулись, заключалась в том, что мы не могли использовать класс Holder (out params) для shorts. В итоге мы создали оболочку Delphi, преобразующую Integer в Short вместо того, чтобы вносить какие-либо изменения в Com4j.

Наконец, я помню, что немного беспокоился о статусе проекта, пока интегрировался. Кажется, нет регулярных обновлений (уже два года с момента последнего выпуска обслуживания).

person Samuel Sjöberg    schedule 14.01.2010
comment
Спасибо. Я не хотел вдаваться в утечку памяти Джейкоба, не сообщая подробностей, но мы это тоже видели. Я думаю, что сделаю демонстрационный проект с com4j и один с Джейкобом, и испытаю различия на собственном опыте. - person Stephen Harmon; 14.01.2010
comment
Я смотрю на переход от com4j к jacob, потому что, к сожалению, com4j работает только с 32-битной Java, а не с 64-битной Java, поэтому в будущем кажется, что он мертв в воде. - person Paul Taylor; 02.03.2011
comment
В качестве обновления комментария @PaulTaylor com4j с тех пор был обновлен с помощью 64-разрядной версии Java. поддержку. - person Rob Andren; 25.03.2013

Хотя это очень старый вопрос, но я также рекомендую новым людям использовать Com4j, потому что он более стабилен, у него есть активное сообщество и даже подключаемый модуль Maven для создания ваших классов Java. Но вы также можете взглянуть на «j-interop».

person Kamiel Ahmadpour    schedule 06.05.2015