AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Callback aus von DLL zu EXE in Delphi

Ein Thema von norwegen60 · begonnen am 13. Dez 2017 · letzter Beitrag vom 14. Dez 2017
Antwort Antwort
Seite 1 von 2  1 2   
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
Der schöne Günther

Registriert seit: 6. Mär 2013
6.108 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Callback aus von DLL zu EXE in Delphi

  Alt 13. Dez 2017, 11:47
Fehlt bei der Implementation von deinem HandleMessage(..) nicht noch die stdcall -Konvention?
  Mit Zitat antworten Zitat
norwegen60

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

AW: Callback aus von DLL zu EXE in Delphi

  Alt 13. Dez 2017, 13:43
Fehlt bei der Implementation von deinem HandleMessage(..) nicht noch die stdcall -Konvention?
Stimmt. Das war es was ich noch fragen wollten, denn dort hatte ich auch beide Varianten im Netz gefunden und beide funktionieren. Also mit und ohne stdcall . Was ist richtig?

Geht in die gleiche Richtung wie in der DLL die Zuweisung FCallBackProc := CallBackProc; oder @FCallBackProc := CallBackProc; Beides funktioniert aber was ist richtig?

Geändert von norwegen60 (13. Dez 2017 um 13:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Callback aus von DLL zu EXE in Delphi

  Alt 13. Dez 2017, 15:03
Fehlt bei der Implementation von deinem HandleMessage(..) nicht noch die stdcall -Konvention?
Stimmt. Das war es was ich noch fragen wollten, denn dort hatte ich auch beide Varianten im Netz gefunden und beide funktionieren. Also mit und ohne stdcall . Was ist richtig?
Ist komplett egal, solange du beides Mal die gleiche Calling-Convention verwendest. Man nimmt ganz gerne stdcall , wenn Dlls z.b. mit anderen Programmiersprachen kompatibel sein sollen, da Delphis implizite Standard pascal -CC nicht überall unterstützt wird.

Geht in die gleiche Richtung wie in der DLL die Zuweisung FCallBackProc := CallBackProc; oder @FCallBackProc := CallBackProc; Beides funktioniert aber was ist richtig?
Ist auch komplett egal bzw. einfach nur Geschmackssache.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.108 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Callback aus von DLL zu EXE in Delphi

  Alt 13. Dez 2017, 16:32
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.
  Mit Zitat antworten Zitat
norwegen60

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

AW: Callback aus von DLL zu EXE in Delphi

  Alt 13. Dez 2017, 19:52
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.
Ich habe das Projekt mal auf eine VM mit Delphi XE kopiert und dort kompiliert und gestartet.
Delphi-Quellcode:
// CallBack aufruf festlegen
procedure SetCallBackProc(CallBackProc: TCallBackProc); stdcall
begin
  FCallBackProc := CallBackProc; // @FCallBackProc := CallBackProc; geht auch
end;
Ohne @ funktioniert es einwandfrei. Mit @ bekomme ich in XE die Meldung "E2035. Not enough parameter."

Dann habe ich in der EXE
Delphi-Quellcode:
// Callback-Handler
procedure HandleMessage(sMsg:WideString); stdcall;
begin
  Form1.meMessage.Lines.Add(sMsg);
end;
mit und ohne stcall; probiert. Das hat beides ohne Probleme funktioniert

und auch
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  // CallBack-Procedure festlegen
  SetCallBackProc(@HandleMessage); // funktioniert mit und ohne @
end;
funktioniert mit und ohne @

Geändert von norwegen60 (13. Dez 2017 um 20:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Callback aus von DLL zu EXE in Delphi

  Alt 14. Dez 2017, 08:27
Ja, der @ Operator scheint in diesem Falle die Typechecks zu deaktivieren.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Callback aus von DLL zu EXE in Delphi

  Alt 14. Dez 2017, 09:12
Das Verhalten des @-Operators läßt sich in den Projektoptionen -> Compiling einstellen, zumindest noch in Delphi2010. Ist das jetzt anders?
  Mit Zitat antworten Zitat
norwegen60

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

AW: Callback aus von DLL zu EXE in Delphi

  Alt 14. Dez 2017, 09:14
Ja, der @ Operator scheint in diesem Falle die Typechecks zu deaktivieren.
Das verstehe ich nicht ganz. Durch die Verwendung von TCallBackProc sollten doch alle Aufrufe vom gleichen Typ sein?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.097 Beiträge
 
Delphi 12 Athens
 
#10

AW: Callback aus von DLL zu EXE in Delphi

  Alt 14. Dez 2017, 10:04
Nicht ganz.
Dank dem @ kann man ohne manuelles Casten auch typlose Pointer zuweisen, wie z.B. von Bei Google suchenGetProcAddress.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:31 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