Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OnClick-Ereignis und DLL (https://www.delphipraxis.net/75561-onclick-ereignis-und-dll.html)

kabuco 21. Aug 2006 14:25


OnClick-Ereignis und DLL
 
Hallo,

habe im Rahmen eines PlugIn Systems versucht eine Funktion meiner dynamisch geladenen DLL dem OnClick-Ereignis eines Buttons zugewiesen. Das Zuweisen funktioniert auch wunderbar (Der Procedurheader ist identisch usw.). Doch wenn ich auf diesen Button Klicke bekomme ich eine AV. Im CPU Fenster erscheinen nur ????. Ich weise die Funktion so zu:

Programm:
Delphi-Quellcode:
type
  TSummenFunktion = procedure(Sender: TObject);

var
  Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.Button1Click(Sender: TObject);
var SummenFunktion: TSummenFunktion;
    Handle: THandle;
begin
 Handle := LoadLibrary(PChar('plugin.dll'));
 if Handle <> 0 then begin
  @Button2.OnClick := GetProcAddress(Handle, 'add');
  if @SummenFunktion <> nil then begin

  end;
  FreeLibrary(Handle);
 end;
end;
DLL:
Delphi-Quellcode:
library Project2;

uses
  SysUtils,
  Classes, Dialogs;

{$R *.res}

procedure add(Sender: TObject);
begin
 ShowMessage(Sender.ClassType.ClassName);
end;

exports
 add;

begin

end.
Gruß kabuco

mirage228 21. Aug 2006 14:28

Re: OnClick-Ereignis und DLL
 
Hi,

Das Problem ist, dass es einen unterschied zwischen der regulären prozedur in der DLL und dem Methodenzeiger des Button-Klick-Events gibt.

Es muss so heissen:
Delphi-Quellcode:
type
  TSummenFunktion = procedure(Sender: TObject) of object;
(Du könntest aber besser den vordefinerten Typ Delphi-Referenz durchsuchenTNotifyEvent verwenden!)

Die Implementierung in der DLL musst du dann auch anpassen. Hier im Forum findest du entsprechende Möglichkeiten und Code-Beispiele: Hier im Forum suchenTMethod und Hier im Forum suchenTNotifyEvent

mfG
mirage228

Der_Unwissende 21. Aug 2006 14:50

Re: OnClick-Ereignis und DLL
 
Hi,
für ein Plugin System solltest du dir vielleicht lieber das Observer-Pattern anschauen.
Dieses Pattern kommt immer dann zum Einsatz, wenn du mehrere Komponenten über den Zustand einer anderen konsistent gehalten werden müssen.
Dabei gibt es zwei Rollen, die Observer und das Observable. Die Rollen sind dann auch recht klar, dein Button (als Beispiel) wäre natürlich das beobachtete Objekt, die Plugins wären die Beobachter. Jetzt musst du nur noch dafür sorgen, dass alle Observer etwas von einer Zustandsänderung merken. Dazu musst du nur das Registrieren/Deregistieren bestimmter Listener zulassen. Ein Listener ist dabei entweder ein Objekt, dass eine bestimmte Schnittstelle implementiert, aber kann natürlich auch ein Funktionszeiger (beliebiger Art) sein. Das kannst du festlegen.
Die müssen halt nur noch in einer Liste gespeichert werden und bei einem OnClick rufst du einfach die Funktion für alle gespeicherten Elemente auf (z.B. alle Funktionszeiger). Damit kannst du dann leicht mehr als eine Dll darüber informieren, dass ein Button gedrückt wurde.
Wer sich dafür interessiert registriert sich dann einfach als Observer bei deinem Observable.

Gruß Der Unwissende


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