AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Callback-Funktion erstellen?

Ein Thema von romber · begonnen am 23. Mai 2013 · letzter Beitrag vom 28. Mai 2013
Antwort Antwort
Seite 1 von 2  1 2      
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Callback-Funktion erstellen?

  Alt 23. Mai 2013, 10:59
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.

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%

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:

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

Vielen Dank!

Geändert von romber (23. Mai 2013 um 16:35 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Callback-Funktion erstellen?

  Alt 23. Mai 2013, 11:13
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

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 @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.
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: Callback-Funktion erstellen?

  Alt 27. Mai 2013, 21:23
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
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!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Callback-Funktion erstellen?

  Alt 27. Mai 2013, 21:30
So was: http://www.michael-puff.de/Programmi...Callback.shtml
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Callback-Funktion erstellen?

  Alt 27. Mai 2013, 21:33
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?
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#6

AW: Callback-Funktion erstellen?

  Alt 27. Mai 2013, 22:21
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.
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Callback-Funktion erstellen?

  Alt 27. Mai 2013, 22:28
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.
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#8

AW: Callback-Funktion erstellen?

  Alt 27. Mai 2013, 22:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Callback-Funktion erstellen?

  Alt 27. Mai 2013, 23:15
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#10

AW: Callback-Funktion erstellen?

  Alt 28. Mai 2013, 00:25
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 "@"?

Geändert von romber (28. Mai 2013 um 01:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:15 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