![]() |
Delphi-Version: 5
Callback aus von DLL zu EXE in Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich will aus einer DLL beliebige String-Informationen von der DLL zur EXE schicken. Dabei können die Ereignisse durch unterschiedliche Funktiionsaufrufe generiert werden. Eine Schnittstelle könnte z.B. für Log-Informationen sein, die die EXE in die DB scheiben soll. Ich habe diverse Berichte zu diesem Theme gelesen und zum Schluss auch ein lauffähiges Konstrukt hinbekommen. Jetzt wollte ich mal nachfragen, ob das so alles korrekt ist oder ob noch Fehler enthalten sind. Lauffähig ist das Ganze und Warnungen erzeugt der Compiler auch keine. Ich habe mal den ganzen Code eingehängt damit die, die auch so was suchen, eine lauffähige Lösung bekommen. Die DLL
Delphi-Quellcode:
Hier ist die Frage ob die Zuweisung in SetCallBackProc über
library dllCallBack;
uses SysUtils, Vcl.ExtCtrls, uDefinition; var FCallBackProc: TCallBackProc; {$R *.res} // Procedure zum testen der CallBack Funktion procedure FTimerTimer(Sender: TObject); begin if Assigned(FCallBackProc) then FCallBackProc(FormatDateTime('hh:mm:ss.zzz', now)); end; // CallBack aufruf festlegen procedure SetCallBackProc(CallBackProc: TCallBackProc); stdcall begin FCallBackProc := CallBackProc; // @FCallBackProc := CallBackProc; geht auch end; // Testloop starten procedure Start; stdcall var i : Integer; begin for i:=1 to 100 do begin FTimerTimer(nil); sleep(200); end; end; exports SetCallBackProc, Start; begin end.
Delphi-Quellcode:
oder besser
FCallBackProc := CallBackProc;
Delphi-Quellcode:
erfolgen muss. Beides funktioniert.
@FCallBackProc := CallBackProc;
Die gemeinsame Schnittstellendefinition
Delphi-Quellcode:
Die EXE
unit uDefinition;
interface type TCallBackProc = procedure(Command: WideString); stdcall; implementation end.
Delphi-Quellcode:
Danke für eure Feedbacks
type
TForm1 = class(TForm) meMessage: TMemo; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} // DLL-Schnittstellen definieren procedure SetCallBackProc(CallBackProc: TCallBackProc); stdcall external 'dllCallBack.DLL'; procedure Start; stdcall external 'dllCallBack.DLL'; // Callback-Handler procedure HandleMessage(sMsg:WideString); begin Form1.meMessage.Lines.Add(sMsg); end; procedure TForm1.Button1Click(Sender: TObject); begin // CallBack-Procedure festlegen SetCallBackProc(@HandleMessage); end; procedure TForm1.Button2Click(Sender: TObject); begin Start; end; Grüße Gerd |
AW: Callback aus von DLL zu EXE in Delphi
Fehlt bei der Implementation von deinem
Delphi-Quellcode:
nicht noch die
HandleMessage(..)
Delphi-Quellcode:
-Konvention?
stdcall
|
AW: Callback aus von DLL zu EXE in Delphi
Zitat:
Delphi-Quellcode:
. Was ist richtig?
stdcall
Geht in die gleiche Richtung wie in der DLL die Zuweisung
Delphi-Quellcode:
oder
FCallBackProc := CallBackProc;
Delphi-Quellcode:
Beides funktioniert aber was ist richtig?
@FCallBackProc := CallBackProc;
|
AW: Callback aus von DLL zu EXE in Delphi
Zitat:
Delphi-Quellcode:
, wenn Dlls z.b. mit anderen Programmiersprachen kompatibel sein sollen, da Delphis implizite Standard
stdcall
Delphi-Quellcode:
-CC nicht überall unterstützt wird.
pascal
Zitat:
|
AW: Callback aus von DLL zu EXE in Delphi
Also ich sehe dass ich, wenn ich das @ weglasse, in beiden Fällen einen Fehler E2009 "Unterschiede in der Aufrufkonvention" bekomme wenn ich versuche eine Routine ohne stdcall in eine Variable zu stecken die stdcall erwartet. Das ist gut.
Bei der @-Variante nicht. |
AW: Callback aus von DLL zu EXE in Delphi
Zitat:
Delphi-Quellcode:
Ohne @ funktioniert es einwandfrei. Mit @ bekomme ich in XE die Meldung "E2035. Not enough parameter."
// CallBack aufruf festlegen
procedure SetCallBackProc(CallBackProc: TCallBackProc); stdcall begin FCallBackProc := CallBackProc; // @FCallBackProc := CallBackProc; geht auch end; Dann habe ich in der EXE
Delphi-Quellcode:
mit und ohne stcall; probiert. Das hat beides ohne Probleme funktioniert
// Callback-Handler
procedure HandleMessage(sMsg:WideString); stdcall; begin Form1.meMessage.Lines.Add(sMsg); end; und auch
Delphi-Quellcode:
funktioniert mit und ohne @
procedure TForm1.Button1Click(Sender: TObject);
begin // CallBack-Procedure festlegen SetCallBackProc(@HandleMessage); // funktioniert mit und ohne @ end; |
AW: Callback aus von DLL zu EXE in Delphi
Ja, der @ Operator scheint in diesem Falle die Typechecks zu deaktivieren.
|
AW: Callback aus von DLL zu EXE in Delphi
Das Verhalten des @-Operators läßt sich in den Projektoptionen -> Compiling einstellen, zumindest noch in Delphi2010. Ist das jetzt anders?
|
AW: Callback aus von DLL zu EXE in Delphi
Zitat:
|
AW: Callback aus von DLL zu EXE in Delphi
Nicht ganz.
Dank dem @ kann man ohne manuelles Casten auch typlose Pointer zuweisen, wie z.B. von ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:38 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