私は現在、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クラスとIITSUerPlaylistクラスを作成しましたが、com4jのみがqueryInterfaceクラスを提供し、IITUserPlaylistは実際にはIITPlaylistのサブクラスではありません。
また、com4jはisメソッドを提供しますが、jacobは提供しません
if (next.is(IITFileOrCDTrack.class))
誰もがこれらの問題を解決する方法を知っていますか?
編集:ある程度の進歩はありましたが、まだ機能していません。クラスのGUID(中括弧を含む)を取得するQueryInterfaceメソッドがあります。jacobgenを実行したときに作成されるjacobgenlog.txtファイルを見て、GUIDを見つけました。 iTunes実行可能ファイル
次に、これはサブクラスに関連することを意図した別のDispatchオブジェクトを返しますが、Iveが行った単純なキャストは無効です、失敗したステップは何ですか?
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で生成されたクラスを使用することにしました。