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

发布于 2024-10-20 01:39:49 字数 2260 浏览 1 评论 0原文

我目前使用 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() 功能被替换为检查 kind

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 {

}

Within

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

I currently use Com4j to talk to iTunes from my Java app, unfortunately it does not work with 64bit Java and looks like it never will, so Im trying to use an alternative called Jacob instead.

Both libraries provide a tool to generate Java classes from a DLL, and the resultant classes are very similar and its been straightforward to change most of the code but Im failing on how to find subtypes

IITPlaylist object = itunes.createFolder(TextLabel.SAVE_ITUNES_PLAYLIST_FOLDER.getMsg());
IITUserPlaylist playlistFolder = object.queryInterface(IITUserPlaylist.class);

Both libraries have created IITPlaylist and IITUSerPlaylist classes but only com4j provides the queryInterface class, and no IITUserPlaylist is not actually a subclass of IITPlaylist.

Also com4j provides an is method, but jacob does not

if (next.is(IITFileOrCDTrack.class))

Anyone know how to resolve these issues ?

EDIT:
Made some progress but still not got it working, there is a QueryInterface method that takes the guid of the class (include the curly brackets) , I found the guid by looking at the jacobgenlog.txt file which is created when you run jacobgen on the iTunes executable

This then returns another Dispatch object that is meant to relate to the subclass, however the simple cast Ive done is invalid, whats the mising step ?

 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);

The is() functionality is replaced by checking the kind

IITTrack next = tracks.getItem(i);
if(next.getKind().equals(ITTrackKind.ITTrackKindFile))

A spanner in the works is that jacobgen getKind() methods are invalid Java because they try to return a new interface, and of course you cannot instantiate an interface, so I had to modify them as follows

ITPlayListKind goes from

public interface ITPlaylistKind extends __MIDL___MIDL_itf_iTunesCOMInterface_0001_0081_0001 {

}

to

public enum ITPlaylistKind {
    ITPlaylistKindUnknown,
    ITPlaylistKindLibrary,
    ITPlaylistKindUser,
    ITPlaylistKindCD,
    ITPlaylistKindDevice,
    ITPlaylistKindRadioTuner;
}

Within IITUserPlaylist

public ITPlaylistKind getKind() {
        return new ITPlaylistKind(Dispatch.get(this, "Kind").toDispatch());
    }

to

public ITPlaylistKind getKind() {
        return  ITPlaylistKind.values()[Dispatch.get(this, "Kind").getInt()];
    }

this wasnt an original idea by me, I got the idea from http://dot-totally.co.uk/software/itunescon/ which appears to be a modified version of the iTunes classes created by jacobgen, I didnt find it added that much and decided to stick with the jacobgen generated classes.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

姜生凉生 2024-10-27 01:39:49

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

只需使用构造函数即可

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));

As soon as I set a bounty I work out the answer for myself.

Simply just use the constructor

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

The QueryInterface and GUID sctrings re not required.

I was also having a problem working out how to add a track to a playlist, but you just need to
construct a Variant from the track ( I dont have to do this anywhere else)

IITTrack next = itunes.getLibraryPlaylist().getTracks()
      .getItemByPersistentID(persistentId.getHighBit(), 
                             persistentId.getLowBit());
playlist.addTrack(new Variant(nextTrack));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文