![]() |
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:
DLL:
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;
Delphi-Quellcode:
Gruß kabuco
library Project2;
uses SysUtils, Classes, Dialogs; {$R *.res} procedure add(Sender: TObject); begin ShowMessage(Sender.ClassType.ClassName); end; exports add; begin end. |
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:
(Du könntest aber besser den vordefinerten Typ
type
TSummenFunktion = procedure(Sender: TObject) of object; ![]() Die Implementierung in der DLL musst du dann auch anpassen. Hier im Forum findest du entsprechende Möglichkeiten und Code-Beispiele: ![]() ![]() mfG mirage228 |
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