AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OnClick-Ereignis und DLL

Ein Thema von kabuco · begonnen am 21. Aug 2006 · letzter Beitrag vom 21. Aug 2006
Antwort Antwort
kabuco
(Gast)

n/a Beiträge
 
#1

OnClick-Ereignis und DLL

  Alt 21. Aug 2006, 15:25
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
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: OnClick-Ereignis und DLL

  Alt 21. Aug 2006, 15:28
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: OnClick-Ereignis und DLL

  Alt 21. Aug 2006, 15:50
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 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