0
COM活动我试图钩住从Java的专有网络协议栈。这个堆栈由一个COM对象提供,并且我设法使用com4j来挂钩它。不幸的是,网络堆栈是基于事件的,所以我需要我的代码发出请求并订阅提供响应的事件。订阅与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对象抛出的事件?
我试着与我确实想换对象类似的代码,并以同样的方式,这使我相信,这个问题与我的开发环境做失败。