Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Callback-Funktion erstellen? (https://www.delphipraxis.net/174991-callback-funktion-erstellen.html)

romber 23. Mai 2013 10:59

Callback-Funktion erstellen?
 
Hallo!

Ich beziehe mich auf ein anderes Thema in diesem Forum. Dort möchte ich erfahren, wie man Dll-Add-Ons erstellt und daraus Funktionen aus dem Hostprogramm aufrufen kann.

Zitat:

Zitat von BUG (Beitrag 1216130)
Jup, Callback-Funktion würde passen

Habe seit gestern viele Beiträge über Callback-Funktionen gelesen. Ein sehr guts Tutorial fand ich auf der Seite von Luckie. Kapieren tue ich es, ehrlich gesagt, aber immer noch nicht zu 100% :wall: :oops:

Sagen wir, ich habe einen Add-On als DLL, in dem ein TCP-Client mit einem Server verbindet und die Daten zugeschickt bekommt. Für jeden Datensatz muss eine Funktion im Hostprogramm ausgeführt werden. Diese Funktion erwartet einen XML-String als Parameter und erstellt daraus ein neues Objekt im Hostprogramm. Diese Funktion möchte ich nun dem Add-On irgendwie zur Verfügung stellen. Ich erstelle eine überadene Version der Funktion mit PChar statt String:

Delphi-Quellcode:
function XMLDataToPLDAObject(AXMLData: PChar): Boolean;
Wie estelle ich nun eine Callback-Funktion, die aus DLL aufgerufen werden kann?

Vielen Dank!

Der schöne Günther 23. Mai 2013 11:13

AW: Callback-Funktion erstellen?
 
Ich bleibe dabei, sich den ganzen DLL-, Zeiger- und Aufrufkonventionen-Kampf zu sparen und einfach einen neuen "Server" für lokale Dateien und andere Quellen zu bauen wäre aus meiner Sicht viel einfacher und würde das Client-Hauptprogramm in seinem Kern fast unberührt lassen. An die Delphi-Sittenpolizei werde ich dich jetzt aber nicht verpfeifen :wink:

Deine DLL braucht eine Funktion "registerCallBackProcedure" welcher du als Parameter einen Zeiger gibst. Dieser Zeiger zeigt auf die Funktion in deinem Hauptprogramm welche die DLL später aufrufen können soll.

Ich habe es nicht im Kopf, aber müsste
Delphi-Quellcode:
@meineProzedur
nicht schon reichen?

Und die DLL muss jetzt natürlich auch genau wissen, mit welcher Aufrufkonvention "meineProzedur" arbeitet (cdecl, stdcall, ...) und welche Parameter welchen Typs sie in welcher Reihenfolge erwartet.

romber 27. Mai 2013 21:23

AW: Callback-Funktion erstellen?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1216197)
Ich bleibe dabei, sich den ganzen DLL-, Zeiger- und Aufrufkonventionen-Kampf zu sparen und einfach einen neuen "Server" für lokale Dateien und andere Quellen zu bauen wäre aus meiner Sicht viel einfacher und würde das Client-Hauptprogramm in seinem Kern fast unberührt lassen. An die Delphi-Sittenpolizei werde ich dich jetzt aber nicht verpfeifen :wink:

Habe ich gemacht. Die Server-Variante ist fertig. Nun möchte ich es auch noch mit DLL versuchen.
Ich sitze seit gestern an der Callback-Funktion und kriege es nicht hin. Kann mir jemand mit einem passenden Code-Bespiel helfen, das ganze besser zu verstehen? Wäre super!
In allen Tutorials, die ich gefunden habe, wird die Callback-Funktion direkt beim Zugriff auf die DLL aufgerufen. Bei mir ist ist anders. Die Funktion muss nur bei Bedarf aufgerufen werden, z.B. wenn neue Daten da sind und angezeigt werden müssen. Ich muss also nur den Pointer auf die Funktion übergeben.
Im Voraus vielen Dank!

Luckie 27. Mai 2013 21:30

AW: Callback-Funktion erstellen?
 
So was: http://www.michael-puff.de/Programmi...Callback.shtml

Der schöne Günther 27. Mai 2013 21:33

AW: Callback-Funktion erstellen?
 
Ich glaube was noch fehlt, ist die Erkenntnis, dass die DLL auch eine Variable vom gleichen Typ (z.B. TMeineCallbackProzedur) braucht, um sich die Adresse zu merken, oder?

romber 27. Mai 2013 22:21

AW: Callback-Funktion erstellen?
 
Zitat:

Zitat von Luckie (Beitrag 1216630)

Dieses Tutorial habe ich an erster Stelle gelesen. Mir war und ist bis jetzt nicht klar, welches Teil wohin kommt. So wie es dort beschrieben ist, gehört die ganze Code in das Hauptprogramm, was für mich keinen Sinn ergibt. Wieso braucht man eine Callback-Funktion in dem Hauptprogramm, wo die eigentliche Funktion deklariert ist?
Natürlich liege ich da absolut falsch, denn Luckie hat mit diesem und mit anderen Tutorials auf seiner Seite klasse Arbeit geleistet. Ich bin es, der das nicht kapiert. Deswegen auch meine Frage.

Der schöne Günther 27. Mai 2013 22:28

AW: Callback-Funktion erstellen?
 
Ja, in diesem Tutorial liegen Callback-Funktion und die Funktion, die den Callback ausführen werden in ein- und demselben Programm. Das kann auch Sinn machen, ist aber nicht, was du willst.

Es ist schon spät, deswegen könnte ich etwas übersehen, aber du brauchst:

In deinem Hauptprogramm:
  • Die Funktion, welche die DLL aufrufen können soll
  • Eine Typ-Deklaration (z.B. type TFNProc = procedure(parameter1: Integer; parameter2: Double); stdcall;) deiner Funktion
  • Einen Aufruf einer Funktion der DLL in der Art "Hier, nimm und merke die Adresse meiner Callback-funktion um sie später aufzurufen"

In deiner DLL:
  • Die gleiche Typdeklaration TFNProc wie im Hauptprogramm
  • Eine Variable dieses Typs
  • Eine Funktion "Nimm eine TFNProc-Variable als Parameter und merke dir den Wert in einer Variable"
  • Den Mut und Willen, an die in der Variable gespeicherte Adresse zu springen. Müsste eigentlich schon mit "meineVariable(5, 3.12)" gehen.

romber 27. Mai 2013 22:43

AW: Callback-Funktion erstellen?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1216643)
Ja, in diesem Tutorial liegen Callback-Funktion und die Funktion, die den Callback ausführen werden in ein- und demselben Programm. Das kann auch Sinn machen, ist aber nicht, was du willst.

Es ist schon spät, deswegen könnte ich etwas übersehen, aber du brauchst:

In deinem Hauptprogramm:
  • Die Funktion, welche die DLL aufrufen können soll
  • Eine Typ-Deklaration (z.B. type TFNProc = procedure(parameter1: Integer; parameter2: Double); stdcall;) deiner Funktion
  • Einen Aufruf einer Funktion der DLL in der Art "Hier, nimm und merke die Adresse meiner Callback-funktion um sie später aufzurufen"

In deiner DLL:
  • Die gleiche Typdeklaration TFNProc wie im Hauptprogramm
  • Eine Variable dieses Typs
  • Eine Funktion "Nimm eine TFNProc-Variable als Parameter und merke dir den Wert in einer Variable"
  • Den Mut und Willen, an die in der Variable gespeicherte Adresse zu springen. Müsste eigentlich schon mit "meineVariable(5, 3.12)" gehen.

Vielen Dank! Probiere ich jetzt.

Luckie 27. Mai 2013 23:15

AW: Callback-Funktion erstellen?
 
Zitat:

Zitat von romber (Beitrag 1216641)
Wieso braucht man eine Callback-Funktion in dem Hauptprogramm, wo die eigentliche Funktion deklariert ist?

Um einen Fortschritt zum Beispiel anzeigen zu können? Um in bestimmten Situationen mit dem Benutzer interagieren zu können? Da kann es beliebige Gründe geben.

romber 28. Mai 2013 00:25

AW: Callback-Funktion erstellen?
 
So, jetzt habe ich es kapiert. Fur diejenige, die es auch nicht sofort verstanden haben: die Prozedur DoSomething aus Luckies Totorial deklariert man in der DLL wie jede andere Prozedur oder Funktion und exportiert. Dann lädt man die Funktion dynamisch in dem Hostprogramm und übergibt die Callback-Funktion als Parameter.

@Luckie, @Der schöne Günther
Vielen vielen Dank!

Was mir aufgefallen ist, dass der Aufruf der Callback-Funktion funktioniert gleich ob mit oder ohne "@" davor. Genau so in der DLL, wenn ich den Wert der Funktion-Variable setze.
Was ist dabei der Unterschied? Warum brauche ich "@"?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr.
Seite 1 von 2  1 2      

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