Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi COM Interface: Event von Server zu Client (https://www.delphipraxis.net/123579-com-interface-event-von-server-zu-client.html)

schwa226 4. Nov 2008 22:12


COM Interface: Event von Server zu Client
 
Hi,

hab mich nun etwas durch die COM Interface Tutorials durchgeackert.

Wenn ich dieses Beispiel:
http://delphi.about.com/gi/dynamic/o...7126%2C00.html

Ausführe geht es auch super das ich vom Server zum Client ein Event schicken kann. Jedoch wird durch die Invoke Funktion nur die DispID abgefragt.

Ich möchte jedoch vom Server ein solches Event zum Client schicken:

ProgrammName (PChar) ,Command (Int) : Return Boolean.

Ich will somit den Programmnamen + das auszuführende Command an den Client schicken. Dieser sollte mir dann per Boolean ein OK/NOK zurückgeben.

Gibt es da ein einfaches Beispiel (example Source)?

schwa226 6. Nov 2008 14:58

Re: COM Interface: Event von Server zu Client
 
Keiner eine Idee?

werde einmal genauer meine Aufgabenstellung beschreiben:

Ich habe eine ThirdParty.exe die meine Plugin.DLL läd.

Meine Plugin.DLL sendet Events per COM-Server an die Thirdparty.exe.

Nun habe ich ein Zusatzprogramm.exe geschrieben mit dem ich die Events zu der Thirdparty.exe kontrollieren will.

Also:

ThirdParty.exe -> läd Plugin.DLL (Zusatzprogramm.exe nicht gestartet)
Normal werden Events von der Plugin.DLL an die ThirdParty.exe weiter geschickt.

Nun starte ich meine neue Zusatzprogramm.exe.

Das Programm soll sich irgendwie mit der Plugin.DLL verständigen:

Plugin.DLL erhält Event -> Schickt es weiter an Zusatzprogramm.exe -> bekommt ein True/False zurück -> if True wird das Event an ThirdParty.exe weitergeleitet.

Wie kann man das am einfachsten lösen?

Den ein laden der Plugin.DLL durch die Zusatzprogramm.exe fällt aus, da hier ja keine Events kommen würden.

Die Plugin.DLL und Zusatzprogramm.exe entspringen meinem eigenen Source und somit habe ich da alle Möglichkeiten die ich bei der ThirdParty.exe natürlich nicht habe.

Bitte Hilfe!

sx2008 7. Nov 2008 02:04

Re: COM Interface: Event von Server zu Client
 
Variante 1.)
Dein Zusatzprogramm könnte doch auch als Proxy programmiert werden.
Es bietet also genau das gleiche Interface wie das Plugin an und kann damit anstelle des Plugins von der Thirdparty.exe geladen werden.
Das Zusatzprogramm ruft nun seinerseits das Plugin auf und leitet alle Methodenaufrufe mehr oder weniger 1:1 weiter.

Code:
ThirdParty.exe -> Zusatzprogramm (Proxy) -> Plugin
Das bedeutet natürlich, dass ThirdParty.exe dazu gebracht werden muss, dein Zusatzprogramm zu laden/starten.
Vorteil: du kannst jede Kommunikation zwischen ThirdParty.exe und Plugin überwachen und eingreifen.
Nachteil: man kann nicht dynamisch zur Laufzeit das Zusatzprog starten.

Variante 2.)
Dein Plugin hat zusätzlich zum Interface IPlugin ein weiteres Interface IDiagnose.
Die CoClass muss also beide Interfaces implementieren.

Wenn das Plugin-Objekt erzeugt wird, legt es seinen Interfacepointer in der Running Object Table (ROT) ab.
Wird das Objekt zerstört, entfernt es sich selbst aus der ROT.

Jetzt kommt das Zusatzprogramm und sucht das Objekt in der ROT (mit GetObject()).
Dies ist wichtig, damit sowohl ThirdParty.exe als auch Zusatzprog mit dem gleichen Objekt arbeiten.

Bei Erfolg nimmt es den Interfacepointer und wandelt ihn nach IDiagnose.
Das Zusatzprogramm kann nun über IDiagnose Änderung im Plugin vornehmen (z.B. Properties abfragen und setzen).
Damit das Plugin auch seinerseits mit dem Zusatzprog sprechen kann, bietet das Zusatzprog ein
Objekt mit dem Interface IDiagnoseHost an.
Delphi-Quellcode:
IDiagnose = Interface
  function Getxxxx:integer;         // irgendwas auslesen
  procedure Setxxxx(value:integer); // oder setzen
 
  procedure SetDiagHost(value:IDiagnoseHost); // Objekt für Callback
end;
Das Plugin merkt sich den Interfacepointer von SetDiagHost und hat nun die Möglichkeit
beliebige Methoden über IDiagnoseHost im Zusatzprogramm aufzurufen.

Dieses Vorgehen mit einer Callback-Schnittstelle ist einfacher zu handeln als COM-Events.

schwa226 7. Nov 2008 09:26

Re: COM Interface: Event von Server zu Client
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

danke für die Antwort!

Klingt ja ganz gut mit der CallBack-Schnittstelle.
Jedoch habe ich mit COM noch keine Erfahrungen und tu mich da etwas schwer mit dem Umsetzen.

Im Anhang hätte ich das Grundgerüst von meiner Plugin.DLL.

Kann mir da jemand das um das Interface für meine Zusatzprogramm.exe erweitern/helfen!?

Vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 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