2 votes

Conversion du code Java qui fait appel aux DLL iTunes de Com4j à Jacob

J'utilise actuellement Com4j pour parler à iTunes à partir de mon application Java, malheureusement il ne fonctionne pas avec Java 64bit et il semble qu'il ne le fera jamais, donc j'essaie d'utiliser une alternative appelée Jacob à la place.

Les deux bibliothèques fournissent un outil pour générer des classes Java à partir d'une DLL, et les classes résultantes sont très similaires. Il a été facile de modifier la plupart du code, mais je ne sais pas comment trouver les sous-types.

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

Les deux bibliothèques ont créé les classes IITPlaylist et IITUSerPlaylist mais seul com4j fournit la classe queryInterface, et non IITUserPlaylist n'est pas réellement une sous-classe de IITPlaylist.

De plus, com4j fournit une méthode is, mais pas Jacob.

if (next.is(IITFileOrCDTrack.class))

Quelqu'un sait-il comment résoudre ces problèmes ?

EDIT : J'ai fait quelques progrès mais je n'ai toujours pas réussi à le faire fonctionner, il y a une méthode QueryInterface qui prend le guid de la classe (inclure les crochets), j'ai trouvé le guid en regardant le fichier jacobgenlog.txt qui est créé lorsque vous exécutez jacobgen sur l'exécutable iTunes.

Cela renvoie ensuite un autre objet Dispatch qui est censé se rapporter à la sous-classe, mais le simple cast que j'ai fait est invalide, quelle est l'étape à suivre ?

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

La fonctionnalité is() est remplacée par la vérification du genre

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

La difficulté réside dans le fait que les méthodes getKind() de Jacobgen ne sont pas valides en Java car elles essaient de renvoyer une nouvelle interface, et bien sûr, on ne peut pas instancier une interface. J'ai donc dû les modifier comme suit

ITPlayListKind passe de

public interface ITPlaylistKind extends __MIDL___MIDL_itf_iTunesCOMInterface_0001_0081_0001 {

}

à

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

Dans IITUserPlaylist

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

à

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

Ce n'était pas une idée originale de ma part, j'ai eu l'idée de http://dot-totally.co.uk/software/itunescon/ qui semble être une version modifiée des classes iTunes créées par jacobgen, je n'ai pas trouvé que cela ajoutait beaucoup et j'ai décidé de rester avec les classes générées par jacobgen.

0voto

Paul Taylor Points 1200

Dès que je fixe une prime, je cherche la réponse par moi-même.

Il suffit d'utiliser le constructeur

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

Les sctrings QueryInterface et GUID ne sont pas nécessaires.

J'ai également eu du mal à trouver comment ajouter une piste à une liste de lecture, mais il suffit de construire une Variante à partir de la piste ( je n'ai pas à le faire ailleurs)

IITTrack next = itunes.getLibraryPlaylist().getTracks()
      .getItemByPersistentID(persistentId.getHighBit(), 
                             persistentId.getLowBit());
playlist.addTrack(new Variant(nextTrack));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X