将使用Com4j调用iTunes DLL的Java代码转换为Jacob

时间:2011-03-02 10:32:06

标签: java dll itunes jacob com4j

我目前使用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(包括大括号),我通过查看jacobgenlog.txt文件找到了guid,该文件是在运行jacobgen时创建的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生成的类。

1 个答案:

答案 0 :(得分:0)

一旦我设定赏金,我就会为自己找到答案。

只需使用构造函数

即可
IITPlaylist object = itunes.createFolder
        (TextLabel.SAVE_ITUNES_PLAYLIST_FOLDER.getMsg());
IITUserPlaylist playlistFolder = new IITUserPlayList(object);

不需要QueryInterface和GUID sctrings。

我在解决如何将曲目添加到播放列表方面遇到了问题,但您只需要 从轨道构建变体(我不必在其他任何地方执行此操作)

IITTrack next = itunes.getLibraryPlaylist().getTracks()
      .getItemByPersistentID(persistentId.getHighBit(), 
                             persistentId.getLowBit());
playlist.addTrack(new Variant(nextTrack));