Преобразование Java-кода, который вызывает iTunes DLL от использования Com4j до Jacob - PullRequest
2 голосов
/ 02 марта 2011

В настоящее время я использую Com4j для общения с iTunes из моего Java-приложения, к сожалению, он не работает с 64-битной Java и выглядит так, как никогда, поэтому я пытаюсь использовать альтернативу под названием Jacob.

Обе библиотекипредоставить инструмент для генерации классов Java из DLL, и результирующие классы очень похожи, и было довольно просто изменить большую часть кода, но я не смог найти подтипы

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, который берет указатель класса (включая фигурные скобки), я нашел его, посмотрев на файл jacobgenlog.txt, который создается при запуске jacobgen в исполняемом файле 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 / , которая выглядит как измененная версияКлассы iTunes, созданные jacobgen, я не нашел в этом ничего особенного и решил придерживаться классов, сгенерированных jacobgen.

1 Ответ

0 голосов
/ 17 марта 2011

Как только я назначу вознаграждение, я сам получу ответ.

Просто используйте конструктор

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