JACOB (Java / COM / ActiveX) - Как устранить неполадки при обработке событий? - PullRequest
0 голосов
/ 03 мая 2010

Я пытаюсь использовать JACOB для взаимодействия с COM-объектом.

Мне удалось вызвать метод инициализации объекта (и получить его свойства), но я не получаю никаких событий назад. Код указан ниже.
У меня есть образец страницы HTML + Javascript (работает в IE), которая успешно получает события от того же объекта.
Я рассматриваю следующие варианты, но буду признателен за любые конкретные идеи по устранению неполадок ...

  • Отправить мою программу Java команде, которая разработала объект COM, и они ищут что-нибудь подозрительное на их стороне (есть ли у объекта способ узнать, есть ли клиент, слушающий его события, и были ли они успешно доставлены?)

  • Зайдите в нативные части JACOB и попытайтесь отлаживать на этой стороне. Это немного страшно, учитывая, что мой C ++ ржавый и что я никогда не программировал для Windows.

public static void main(String[] args) {
    try {
        ActiveXComponent c = new ActiveXComponent(
                              "CLSID:{********-****-****-****-************}"); // My object's clsid
        if (c != null) {
            System.out.println("Version:"+c.getProperty("Version"));
            InvocationProxy proxy = new InvocationProxy() {                 
                @Override
                public Variant invoke(String methodName, Variant[] targetParameters) {
                    System.out.println("*** Event ***: " + methodName);
                    return null;
                }
            };
            DispatchEvents de = new DispatchEvents((Dispatch) c.getObject(), proxy);
            c.invoke("Init", new Variant[] {
                    new Variant(10), //param1
                    new Variant(2), //param2
                     });
            System.out.println("Wating for events ...");
            Thread.sleep(60000); // 60 seconds is long enough
            System.out.println("Cleaning up ...");
            c.safeRelease();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        ComThread.Release();
    }
}

Ответы [ 2 ]

1 голос
/ 13 октября 2012

Простой способ устранения неполадок при получении событий - включить отладку Джейкоба, запустив java с параметром com.jacob.debug=true:

java -Dcom.jacob.debug=true ...

Все полученные события представлены в виде стандартной ошибки (или вывода):

Thread-0: InvocationProxy: trying to invoke Change on Sink@882c01f
Thread-0: InvocationProxy: listener (Sink@882c01f) doesn't implement Change
1 голос
/ 07 мая 2010

Вот решение моей конкретной проблемы:

Оказалось, что COM-объект был написан как невидимый элемент управления ActiveX, который предполагает, что он работает в контексте окна.Это было «обнаружено» командой разработчиков компонента после того, как я дал им программу на основе JACOB.

Обеспечение контекста окна - это то, чего JACOB, похоже, не делает.

Решением в нашем случае будет избавление от COM (и использование JNA для прямого вызова функций C в нативной DLL).

...