Autor Beitrag
Markus123
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35


Delphi 2007
BeitragVerfasst: Mo 04.08.08 11:41 
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:
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35


Delphi 2007
BeitragVerfasst: 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
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mo 04.08.08 13:31 
Suche bei Google DIESE SUCHE brachte das hier. Ich denke da wird geholfen.
Markus123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35


Delphi 2007
BeitragVerfasst: 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