Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - COM: Objekt zu Dispinterface
Markus123 - Mo 04.08.08 11:41
Titel: COM: Objekt zu Dispinterface
Hallo zusammen,
ich werde noch wahnsinnig mit folgendem Problem:
Eine Kommunikation mit einer anderen Anwendung soll über COM laufen. Also habe ich brav ein TLB erzeugt. Nun kann ich per CreateComObject auch die eigentliche Schnittstelle (interface) aufrufen und grob verwenden.
Jetzt soll aber auch auf Ereignisse der Fremdanwendung reagiert werden. Normalerweise sind die ja z.B. bei Forms Teil des "Haupt"-Objekts und ich muss der Ereignis-procedure meine eigene procedure zuweisen - nur eben hier nicht. Folgender Code steht statt dessen in der TLB zur Verfügung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| IApplicationEvents = dispinterface ['{blabla}'] procedure OnFinished(const ID: WideString); dispid 1; procedure OnClose; dispid 3; procedure OnMinimized; dispid 5; end; |
Aus Beiträgen im Forum und bei Google-Suche habe ich gefunden, dass es in etwa so gehen sollte: Eine Klasse definieren, die von TObjekt und IApplicationEvents abgeleitet ist, die Ereignisse so übernehmen und ausprogrammieren. Danach ein Create auf die Klasse und fertig.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| TTest = class(TObject, IApplicationEvents) public procedure OnFinished(const ID: WideString); procedure OnClose; procedure OnMinimized; end; |
Bevor ich jetzt mit TTest.Create usw. weitermachen kann, scheitert es bereits hier im Compiler: "Interface-Typ benötigt". Die Hilfe zu diesem Fehler hat mir jetzt auch nicht weitergeholfen.
Leider muss ich Euch jetzt damit belästigen, da ich mit meinem Latein am Ende bin. Wer kann mir an dieser Stelle weiterhelfen?
Danke schon einmal im voraus für jede Hilfe!
Grüße
Markus
iKilledKenny - Mo 04.08.08 12:57
Also der Compiler-Fehler sollte daher kommen, dass man eine Klasse, die ein Interface implementiert, nicht von TObject, sondern von TInterfacedObject ableiten muss.
Wie allerdings die Sache mit Events bei COM-Objekten im Detail funktioniert, kann ich auch nicht sagen.
Markus123 - Mo 04.08.08 13:20
Hallo iKilledKenny,
leider Fehlanzeige. Auch mit TTest = class(TInterfacedObject, IApplicationEvents)habe ich es schon probiert. Immer die gleiche Meldung...
Grüße
Markus
Markus123 - Di 05.08.08 15:40
Den Link hatte ich schon mal, fand das aber zu komplex für ein "einfaches" Event. Allerdings sind meine Befürchtungen wahr geworden: Das Kapitel "A Handcrafted Automation Client Event Sink" hat als einziges geholfen!
Wer also mal mit diesem Problem zu kämpfen hat: Den Source aus diesem Kapitel kopieren, die Ereignisnummern anpassen und schon geht's!
Grüße
Markus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!