ok. Die Theorie:
Callback steht für Rückruf bzw. Rückfrage
und genau darum geht es auch.
Damit die
DLL in deinem Hauptprogramm eine Funktion aufrufen kann wenn etwas passiert (zum Beispiel das Form geschlossen wird), muss die
DLL natürlich wissen welche Funktion sie aufrufen muss.
Dafür teilst du der
DLL die Speicher-Adresse deiner Funktion mit.
Die Adresse einer Funktion oder Variablen bekommst du durch vorranstellen des @
Mit
@MeineFunktion
bekommst du also die Speicheradresse von MeineFunktion heraus.
Diese musst du der
DLL übergeben. Die
DLL merkt sich die Adresse und ruft dann bei Eintreten des Ereignisses eben die Funktion an dieser Adresse auf.
deine
dll:
Delphi-Quellcode:
var
gCallBack:
procedure() =
nil;
//Variable für die Adresse der Funktion aus dem Hauptprogramm
//Diese Funktion muss das Hauptprogramm aufrufen um der DLL die Adresse mitzuteilen
procedure SetCallBack(ACallback: Pointer);
begin
@gCallBack := ACallBack;
end;
[...]
//OnFormClosed
// Wenn eine Callbackfunktion mitgeteilt wurde (diese also ungleich nil ist)
if Assigned(gCallBack)
then
gCallBack();
//Callbackfunktion aufrufen.
[...]
exports
SetCallBack;
//Damit das Hauptprogramm uns die Adresse mitteilen kann müssen wie die dafür benötigte Funktion exportieren
Hauptprogramm
Delphi-Quellcode:
procedure SetCallBack(ACallBack: Pointer);
external '
deinedll.dll';
[...]
//Diese Funktion soll die DLl aufrufen wenn sie fertig ist (dafür übergeben wir an anderer Stelle die Adresse)
procedure GCallbackProcedure();
begin
ShowMessage('
Form wurde geschlossen');
end;
//durch aufruf dieser Funktion teilen wir der dll die Adresse der Callback-Funktion mit
procedure DerDllDieAdresseMitteilen();
begin
//Die Funktion in der DLL aufrufen mit welcher wir der DLL mitteilen an welcher Adresse die Callback-Funktion liegt
SetCallBack(@GCallbackProcedure);
end;