gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:22:48 25 4
gpt4 key购买 nike

我目前使用 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))

工作中的一个 Spanner 是 jacobgen getKind() 方法是无效的 Java,因为它们试图返回一个新的接口(interface),当然你不能实例化一个接口(interface),所以我不得不按如下方式修改它们

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 生成的类。

最佳答案

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

只需使用构造函数

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

不需要 QueryInterface 和 GUID 字符串。

我也遇到了如何将轨道添加到播放列表的问题,但你只需要从轨道构造一个变体(我不必在其他任何地方这样做)

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

关于java - 将调用 iTunes DLL 的 Java 代码从使用 Com4j 转换为 Jacob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5166166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com