2

私は現在、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で生成されたクラスを使用することにしました。

4

1 に答える 1

0

賞金を設定するとすぐに、自分で答えを見つけます。

コンストラクターを使用するだけです

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));
于 2011-03-17T14:25:52.090 に答える