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:
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.
Hier ist die Frage ob die Zuweisung in SetCallBackProc über
FCallBackProc := CallBackProc;
oder besser
@FCallBackProc := CallBackProc;
erfolgen muss. Beides funktioniert.
Die gemeinsame Schnittstellendefinition
Delphi-Quellcode:
unit uDefinition;
interface
type
TCallBackProc =
procedure(Command: WideString);
stdcall;
implementation
end.
Die
EXE
Delphi-Quellcode:
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;
Danke für eure Feedbacks
Grüße
Gerd