![]() |
Callback-Funktion erstellen?
Hallo!
Ich beziehe mich auf ![]() Zitat:
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:
Wie estelle ich nun eine Callback-Funktion, die aus DLL aufgerufen werden kann?
function XMLDataToPLDAObject(AXMLData: PChar): Boolean;
Vielen Dank! |
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:
nicht schon reichen?
@meineProzedur
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. |
AW: Callback-Funktion erstellen?
Zitat:
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! |
AW: Callback-Funktion erstellen?
|
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?
|
AW: Callback-Funktion erstellen?
Zitat:
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. |
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:
In deiner DLL:
|
AW: Callback-Funktion erstellen?
Zitat:
|
AW: Callback-Funktion erstellen?
Zitat:
|
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 06:46 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