0

我正在尝试从 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 对象有问题,所以我回到基础并尝试实现 com4j 源附带的 iTunes 示例。他们的示例如下所示:

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 对象抛出的事件吗?

我已经用我实际上试图包装的对象尝试了类似的代码,但它以同样的方式失败,这让我相信这个问题与我的开发环境有关。

4

1 回答 1

0

该线程已经有几个月的历史了,但是您是否使用了生成的事件接口并检查了正确的@IID("{...}").tlb在我的情况下,当我使用 OLE/COM 对象查看器 将它与 typelib(文件)中的同一类进行比较时,这是错误的。

在创建了一个正确的公共抽象类之后,@IID它对我来说很好。

于 2012-03-16T13:34:37.150 回答