首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将调用iTunes DLL的Java代码从使用Com4j转换为雅各布

将调用iTunes DLL的Java代码从使用Com4j转换为雅各布
EN

Stack Overflow用户
提问于 2011-03-02 18:32:06
回答 1查看 887关注 0票数 2

我目前使用Com4j从我的Java应用程序中与iTunes对话,不幸的是它不能在64位Java上工作,而且看起来永远不会,所以我正在尝试使用一个名为雅各布的替代方案。

这两个库都提供了从DLL生成Java类的工具,并且生成的类非常相似,并且可以直接更改大部分代码,但我在如何查找子类型方面失败了

代码语言:javascript
复制
IITPlaylist object = itunes.createFolder(TextLabel.SAVE_ITUNES_PLAYLIST_FOLDER.getMsg());
IITUserPlaylist playlistFolder = object.queryInterface(IITUserPlaylist.class);

这两个库都创建了IITPlaylist和IITUSerPlaylist类,但只有com4j提供了queryInterface类,并且没有IITUserPlaylist实际上不是IITPlaylist的子类。

此外,com4j还提供了is方法,但雅各布没有

代码语言:javascript
复制
if (next.is(IITFileOrCDTrack.class))

有人知道如何解决这些问题吗?

编辑:虽然取得了一些进展,但仍然不能正常工作,有一个QueryInterface方法可以获取类的guid (包括花括号),我通过查看在iTunes可执行文件上运行jacobgen时创建的jacobgenlog.txt文件找到了guid

然后返回另一个Dispatch对象,该对象旨在与子类相关,但是简单的强制转换是无效的,遗漏的步骤是什么?

代码语言:javascript
复制
 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()功能被替换为检查类型

代码语言:javascript
复制
IITTrack next = tracks.getItem(i);
if(next.getKind().equals(ITTrackKind.ITTrackKindFile))

其中的一个技巧是jacobgen getKind()方法是无效的Java,因为它们试图返回一个新的接口,当然您不能实例化一个接口,所以我必须按如下方式修改它们

ITPlayListKind来自

代码语言:javascript
复制
public interface ITPlaylistKind extends __MIDL___MIDL_itf_iTunesCOMInterface_0001_0081_0001 {

}

代码语言:javascript
复制
public enum ITPlaylistKind {
    ITPlaylistKindUnknown,
    ITPlaylistKindLibrary,
    ITPlaylistKindUser,
    ITPlaylistKindCD,
    ITPlaylistKindDevice,
    ITPlaylistKindRadioTuner;
}

在IITUserPlaylist中

代码语言:javascript
复制
public ITPlaylistKind getKind() {
        return new ITPlaylistKind(Dispatch.get(this, "Kind").toDispatch());
    }

代码语言:javascript
复制
public ITPlaylistKind getKind() {
        return  ITPlaylistKind.values()[Dispatch.get(this, "Kind").getInt()];
    }

这不是我最初的想法,我的想法是从http://dot-totally.co.uk/software/itunescon/得到的,它似乎是由jacobgen创建的iTunes类的修改版本,我没有发现它增加了那么多,所以决定坚持使用jacobgen生成的类。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-17 22:25:52

一旦我设置了赏金,我就会自己想出答案。

只需使用构造函数即可

代码语言:javascript
复制
IITPlaylist object = itunes.createFolder
        (TextLabel.SAVE_ITUNES_PLAYLIST_FOLDER.getMsg());
IITUserPlaylist playlistFolder = new IITUserPlayList(object);

不需要QueryInterface和GUID筛选。

我还遇到了一个问题,如何将曲目添加到播放列表中,但你只需要从曲目构造一个变体(我不需要在其他地方做这件事)

代码语言:javascript
复制
IITTrack next = itunes.getLibraryPlaylist().getTracks()
      .getItemByPersistentID(persistentId.getHighBit(), 
                             persistentId.getLowBit());
playlist.addTrack(new Variant(nextTrack));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5166166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档