我目前使用 Com4j 从我的 Java 应用程序与 iTunes 对话,不幸的是它不适用于 64 位 Java,而且看起来永远不会,所以我尝试使用名为 Jacob 的替代方案。
这两个库都提供了一个从 DLL 生成 Java 类的工具,生成的类非常相似,并且可以直接更改大部分代码,但我无法找到子类型
IITPlaylist object = itunes.createFolder(TextLabel.SAVE_ITUNES_PLAYLIST_FOLDER.getMsg());
IITUserPlaylist playlistFolder = object.queryInterface(IITUserPlaylist.class);
这两个库都创建了 IITPlaylist 和 IITUSerPlaylist 类,但只有 com4j 提供了 queryInterface 类,并且没有 IITUserPlaylist 实际上不是 IITPlaylist 的子类。
com4j 也提供了 is 方法,但 jacob 没有
if (next.is(IITFileOrCDTrack.class))
有谁知道如何解决这些问题?
编辑:取得了一些进展,但仍未使其正常工作,有一个 QueryInterface 方法采用类的 guid(包括大括号),我通过查看运行 jacobgen 时创建的 jacobgenlog.txt 文件找到了 guid在 iTunes 可执行文件上
然后返回另一个与子类相关的 Dispatch 对象,但是我所做的简单转换是无效的,缺少什么步骤?
private static final String USER_PLAYLIST_GUID = "{0A504DED-A0B5-465A-8A94-50E20D7DF692}";
IITPlaylist object = itunes.createFolder(TextLabel.SAVE_ITUNES_PLAYLIST_FOLDER.getMsg());
IITUserPlaylist playlistFolder = (IITUserPlaylist)object.QueryInterface(USER_PLAYLIST_GUID);
is() 功能被替换为检查种类
IITTrack next = tracks.getItem(i);
if(next.getKind().equals(ITTrackKind.ITTrackKindFile))
工作中的一个扳手是 jacobgen getKind() 方法是无效的Java,因为它们试图返回一个新接口,当然你不能实例化一个接口,所以我不得不修改它们如下
ITPlayListKind 来自
public interface ITPlaylistKind extends __MIDL___MIDL_itf_iTunesCOMInterface_0001_0081_0001 {
}
至
public enum ITPlaylistKind {
ITPlaylistKindUnknown,
ITPlaylistKindLibrary,
ITPlaylistKindUser,
ITPlaylistKindCD,
ITPlaylistKindDevice,
ITPlaylistKindRadioTuner;
}
在 IITUserPlaylist 内
public ITPlaylistKind getKind() {
return new ITPlaylistKind(Dispatch.get(this, "Kind").toDispatch());
}
至
public ITPlaylistKind getKind() {
return ITPlaylistKind.values()[Dispatch.get(this, "Kind").getInt()];
}
这不是我最初的想法,我从http://dot-totally.co.uk/software/itunescon/得到这个想法,这似乎是 jacobgen 创建的 iTunes 类的修改版本,我没有发现它添加了很多,并决定坚持使用 jacobgen 生成的类。