Mein derzeitiges Hauptprojekt macht ausgiebig Gebrauch vom iTunes
COM-Interface. Das ist gut dokumentiert, so dass das Einbinden in mein Programm kaum Probleme machte, obwohl ich ansonsten von
Com-Objekten und Interfaces so gut wie keine Ahnung habe. Um auf iTunes zugreifen zu können, muss ein
COM-Object initialisiert werden. Dabei wird immer das lokale iTunes gestartet, erst danach kann auf den vollen Funktionsumfang zugegriffen werden.
In jeder Programmfunktion, die auf das
COM Interface zugreift, lasse ich itunes auf NIL prüfen und ggf. neu initialisieren. Ich möchte nämlich nicht bei jedem Programmstart auch Itunes starten, da ein großer Teil des Programmes ohne das
COM Interface auskommt.
Falls iTunes beendet wird, während mein Programm läuft, wird meine iTunes - Variable natürlich obsolet. Also muss mein Programm erfahren, dass Itunes beendet ist. Als Notbehelf hatte ich bisher mit FindWindow nach einem offenen Itunes-Fenster gefahndet und bei Nichtvorhandensein die iTunes - Variable auf NIL gesetzt. Aber das sollte doch mit dem 'OnQuittingEvent' aus der Itunes Typelibrary eleganter gehen. Aber die Behandlung solcher
COM-Events ist offenbar nicht ganz trivial. Bei meinen Recherchen stieß ich auf EventSinkImp, mit dem sich ein Wrapper für
COM-Events erstellen läßt. Der ließ sich problemlos als Komponente installieren und in mein Programm einbinden. Aber beim Initialisieren gab es einen Fehler:
Delphi-Quellcode:
// iTunesEvents1: TiTunesLibIiTunesEvents;
Function TGL4Mainform.initItunes:Boolean;
begin
iTunes:= coiTunesApp.Create;
result:= itunes <>
NIL
If result
Then iTunesEvents1.Connect (iTunes);
end;
//**********************************************************************
unit iTunesLibEvents;
//[...]
procedure TiTunesLibEventsBaseSink.Connect (
const ASource: IUnknown);
var
pcpc: IConnectionPointContainer;
begin
Assert (ASource <>
nil);
Disconnect;
try
OleCheck (ASource.QueryInterface (IConnectionPointContainer, pcpc));
OleCheck (pcpc.FindConnectionPoint (FSinkIID, FCP));
OleCheck (FCP.Advise (Self, FCookie));
//<<<< hier brach das Programm beim Debugging mit 'Unbekannter Fehler' ab
FSource := ASource;
except
raise Exception.Create (Format ('
Unable to connect %s.'#13'
%s',
[
Name,
Exception (ExceptObject).
Message]
));
end;
{ finally }
end;
Da war ich mit meinen bescheidenen Mitteln leider aufgeschmissen
Das war Ende März. Gestern habe ich mich noch einmal darangesetzt, und
oh Wunder, das Ding funktioniert ohne Änderung auf einmal fehlerlos! Die Events werden korrekt weitergereicht.
Jetzt rätsele ich, woran das liegen könnte. Der Aufruf in meinem Programm und die ItunesLibEvents -
Unit sind absolut unverändert, allerdings wurde zwischenzeitlich ein Itunes-Update und das übliche Windows-Update (W7) durchgeführt. Auch wenn es jetzt funktioniert, bleibt natürlich eine erhebliche Unsicherheit, solange ich nicht den wahren Grund kenne.
Vielleicht kann mir hier jemand, der sich mit
COM - Programmierung besser auskennt, einen Tipp geben?
Gruß Maekkelrajter