Einzelnen Beitrag anzeigen

norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#1

Callback aus von DLL zu EXE in Delphi

  Alt 13. Dez 2017, 11:34
Delphi-Version: 5
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
Angehängte Dateien
Dateityp: zip CallBack.zip (63,6 KB, 14x aufgerufen)

Geändert von TBx (14. Dez 2017 um 05:52 Uhr) Grund: Delphi-Tag repariert
  Mit Zitat antworten Zitat