Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kommunikation zwischen Hauptanwendung und Plugin (https://www.delphipraxis.net/125090-kommunikation-zwischen-hauptanwendung-und-plugin.html)

RWarnecke 30. Nov 2008 16:33


Kommunikation zwischen Hauptanwendung und Plugin
 
Hallo zusammen,

ich habe den ersten Teil von sakuras Tutorial PlugIns in eigenen Anwendungen durchegelesen und ausprobiert. Es funktioniert auch alles soweit. Nur leider bekomme ich keine Kommunikation zwischen Hauptanwendung und PlugIn hin. Ich möchte gerne, dass zum Beispiel ein Label oder der Inhalt eines Memos ausgelsen wird und dann im PlugIn angezeigt wird.

Wie und was muss ich machen, damit mein Vorhaben funktioniert ?

RWarnecke 6. Dez 2008 12:24

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
*push* Hat keiner eine Idee für mich ?? *push* :spin:

mkinzler 6. Dez 2008 12:38

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Implemnetiere eine Funktion dafür im Plugin und exportiere diese

RWarnecke 6. Dez 2008 12:53

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Ich probiere es derzeit so. In meiner Hauptanwendung habe ich folgendes drinstehen :
Delphi-Quellcode:
type
//
// Declaration of class for the interface IApplication
//
  IApp = interface(IInterface)
    function GetTheCaption:string;
  end;
  TAppInf = class(TInterfacedObject, IApp)
  public
    function GetTheCaption: String;
  end;

...

implementation

...

{ TAppInt }

function TAppInf.GetTheCaption: string;
begin
  result := 'Das ist ein Test für ein Interface';
end;
Die Unit, die ich in der DLL und in der Hauptanwendung mit einfüge hat den folgenden Teil :
Delphi-Quellcode:
  IApp = interface(IInterface) ['{EE10386E-F8B8-44A1-8A88-D809B4EA1964}']
    function GetTheCaption:string;
  end;
In der DLL selber mache ich dann folgendes :
Delphi-Quellcode:
var
  PlgApp: IApp

...

procedure TPlugIn01.Execute;
begin
  Form1 := TForm1.Create(nil);
  Form1.Label1.Caption := PlgApp.GetTheCaption;
  Form1.Show;
end;
Was mache ich falsch ? Oder habe ich das Prinzip der Interfaces noch nicht verstanden ?

mkinzler 6. Dez 2008 12:57

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Hauptprogramm und Dll haben eigene Instanzen der VCL.
Deshalb Funktion für Ausgabe der Dll vom Hauptprogramm aufrufen.

RWarnecke 6. Dez 2008 13:06

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Zitat:

Zitat von mkinzler
Hauptprogramm und Dll haben eigene Instanzen der VCL.
Deshalb Funktion für Ausgabe der Dll vom Hauptprogramm aufrufen.

Wenn ich das jetzt richtig verstehe, dann muss das ganze genau anders herum sein, richtig ? Mein Vorhaben ist aber eigentlich bestimmte Funktionen für die Plugin's zur Verfügung zu stellen. Dann ist doch mein Denkansatz, so wie ich es jetzt mache mit den Interfaces falsch oder ?

mkinzler 6. Dez 2008 13:27

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Dlls unterstützen ja keine Objekte im Interface. Wie verbindest du die beiden Objekte (Hauptprogramm/Dll)?

RWarnecke 6. Dez 2008 13:39

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Zitat:

Zitat von mkinzler
Dlls unterstützen ja keine Objekte im Interface. Wie verbindest du die beiden Objekte (Hauptprogramm/Dll)?

Da bin ich mir jetzt etwas unsicher. Ich denke über die Klasse TAppInf. Die Klasse wird beim Starten der Anwendung erzeugt. Aber ich glaube, dass ich damit flasch liege oder ?

mkinzler 6. Dez 2008 13:44

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Über diese Klasse funktioniert es, es existieren aber verschiedene Objekte (eines im Hauptprogramme und jeweils ein Proxy-Objekt im Plugin)

RWarnecke 6. Dez 2008 13:59

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von mkinzler
Über diese Klasse funktioniert es, es existieren aber verschiedene Objekte (eines im Hauptprogramme und jeweils ein Proxy-Objekt im Plugin)

Das verstehe ich nicht ganz. Ich deklariere doch im Hauptprogramm das Interface, die Klasse und setze noch die GUID fest. Mit der gleichen Unit erstelle ich doch auch die DLL. Das heißt jetzt für mich, dass ich doch mit dem gleichen Objekt arbeite oder nicht ?

Im Anhang die DLL und die Unit die mit den Deklarationen. Die Deklarationen im Hauptprogramm wie in Beitrag 4.

Apollonius 6. Dez 2008 14:10

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Du übergibst der DLL doch gar kein Interface.

RWarnecke 6. Dez 2008 14:18

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Zitat:

Zitat von Apollonius
Du übergibst der DLL doch gar kein Interface.

Das kann ich doch als Property übergeben oder ?

Apollonius 6. Dez 2008 14:21

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Als Property wovon? Du solltest deine TLoadPlugin-Definition um einen Parameter für das Interface erweitern.

RWarnecke 6. Dez 2008 14:30

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Zitat:

Zitat von Apollonius
Als Property wovon? Du solltest deine TLoadPlugin-Definition um einen Parameter für das Interface erweitern.

Ich setze eine Variable in die Definition und wie kann ich dann darauf zugreifen ? Ich komme da irgednwie gerade nicht ganz mit.

Apollonius 6. Dez 2008 14:33

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Aus dem Hauptprogramm rufst du doch die vom Plugin exportierte Funktion LoadPlugin auf. Das ist die Gelegenheit, um dem Plugin das Interface zu übergeben.

RWarnecke 6. Dez 2008 14:45

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Zitat:

Zitat von Apollonius
Aus dem Hauptprogramm rufst du doch die vom Plugin exportierte Funktion LoadPlugin auf. Das ist die Gelegenheit, um dem Plugin das Interface zu übergeben.

Ok, das mache ich ja jetzt schon. Nur wenn ich jetzt in der Execute-Function in der DLL die Funktion des Interfaces aufrufe, bekomme ich immer eine EAccessViolation in der folgenden Zeile :
Delphi-Quellcode:
var
  PlgApp : IApp;

{...}

  Form1.Label1.Caption := PlgApp.GetTheCaption;

Apollonius 6. Dez 2008 14:51

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Zitat:

Zitat von RWarnecke
Ok, das mache ich ja jetzt schon.

Wo?

RWarnecke 6. Dez 2008 15:16

Re: Kommunikation zwischen Hauptanwendung und Plugin
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Apollonius
Zitat:

Zitat von RWarnecke
Ok, das mache ich ja jetzt schon.

Wo?

Die aktualiseirten Dateien im Anhang. Mittlerweile habe ich es hinbekommen, dass er die Funktion aus der Hauptanwendung ausführt. Nur beim Schliessen der Form, kommt wieder eine EAccessViolation. Ich schätze, dass ich da irgendwas nicht freigebe oder zuviel. So sieht die Startfunktion für das Plugin aus :
Delphi-Quellcode:
procedure TMainForm.ExecutePlugIn(Sender: TObject);
begin
  if Sender = nil then
    Exit;
  if not (Sender is TMenuItem) then
    Exit;
  if FPlugIns[TMenuItem(Sender).Tag].PlugIn <> nil then
    FPlugIns[TMenuItem(Sender).Tag].PlugIn.Execute;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz