В настоящее время я использую 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.