AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

COM - Events

Ein Thema von Maekkelrajter · begonnen am 28. Apr 2018
Antwort Antwort
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
118 Beiträge
 
Delphi 11 Alexandria
 
#1

COM - Events

  Alt 28. Apr 2018, 14:13
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz