Подписка на COM-события с Com4j

Я пытаюсь подключиться к проприетарному сетевому стеку из Java. Стек предоставляется COM-объектом, и мне удалось подключиться к нему с помощью com4j. К сожалению, сетевой стек основан на событиях, поэтому мне нужен мой код для отправки запросов и подписки на события, которые предоставляют ответы.

Каждый раз, когда я пытаюсь подписаться на события, мой код генерирует исключение com4j.ExecutionException, содержащее трассировку стека, подобную следующей:

Exception in thread "main" com4j.ExecutionException: com4j.ComException: 80040200 (Unknown error) : .\invoke.cpp:517
at com4j.ComThread.execute(ComThread.java:203)
at com4j.Task.execute(Task.java:25)
at com4j.Wrapper.advise(Wrapper.java:255)
at com4j.Wrapper.advise(Wrapper.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com4j.Wrapper.invoke(Wrapper.java:135)
at $Proxy5.advise(Unknown Source)
at main.Main.<init>(Main.java:14)
at main.Main.main(Main.java:131)

Caused by: com4j.ComException: 80040200 (Unknown error) : .\invoke.cpp:517
at com4j.Native.invoke(Native Method)
at com4j.StandardComMethod.invoke(StandardComMethod.java:42)
at com4j.Wrapper$InvocationThunk.call(Wrapper.java:335)
at com4j.Task.execute(Task.java:36)
at com4j.Wrapper$InvocationThunk.invoke(Wrapper.java:324)
at com4j.Wrapper.invoke(Wrapper.java:163)
at com4j.$Proxy9.FindConnectionPoint(Unknown Source)
at com4j.Wrapper$3.call(Wrapper.java:261)
at com4j.Wrapper$3.call(Wrapper.java:255)
at com4j.Task.invoke(Task.java:51)
at com4j.ComThread.run0(ComThread.java:153)
at com4j.ComThread.run(ComThread.java:134)

Сначала я решил, что что-то не так с моим кодом или с моим COM-объектом, поэтому я вернулся к основам и попытался реализовать пример iTunes, который поставляется с исходным кодом com4j. Их пример выглядит так:

public class Main {
public static void main(String[] args) throws Exception {
    IiTunes iTunes = ClassFactory.createiTunesApp();

    EventCookie cookie = iTunes.advise(_IiTunesEvents.class, new _IiTunesEvents() {
        public void onDatabaseChangedEvent(Object deletedObjectIDs, Object changedObjectIDs) {
            System.out.println("Database changed:" + deletedObjectIDs + "," + changedObjectIDs);
        }

        public void onPlayerPlayEvent(Object iTrack) {
            System.out.println("Playing " + iTrack);
        }

        public void onPlayerStopEvent(Object iTrack) {
            System.out.println("Stopped " + iTrack);
        }
    });

    IITTrack track = iTunes.currentTrack();
    if(track==null) {
        System.out.println("Nothing is playing");
    } else {
        System.out.println("Now playing: "+ track.name());
    }

    System.out.println("Listening to events (will quit in 15 seconds)");
    System.out.println("Play/stop songs in iTunes and see what happens");
    Thread.sleep(15000);

    cookie.close();
}
}

Когда я пытаюсь запустить этот пример на своей машине, я получаю указанное выше исключение в строке

EventCookie cookie = iTunes.advise(_IiTunesEvents.class, new _IiTunesEvents() {...

Кто-нибудь знает, почему я не могу подписаться на события, создаваемые COM-объектом?

Я пробовал аналогичный код с объектом, который я на самом деле пытаюсь обернуть, и он не работает таким же образом, что наводит меня на мысль, что проблема связана с моей средой разработки.


person MusikPolice    schedule 13.10.2011    source источник


Ответы (1)


Теме уже несколько месяцев, но вы использовали сгенерированный интерфейс событий и проверили правильность @IID("{...}")? В моем случае это было неправильно, когда я сравнивал его с тем же классом в typelib (файл .tlb) с помощью OLE/COM Object Viewer.

После создания общедоступного абстрактного класса с правильным @IID у меня все заработало.

person jeid    schedule 16.03.2012