Thema: Delphi DLL Parameterübergabe

Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: DLL Parameterübergabe

  Alt 22. Jun 2007, 10:38
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat