TConfigTransfer.DoWork
ist eine normale Klassen-Methode nehme ich an? Das Problem ist, dass bei solchen Methoden immer ein versteckter
Self
Parameter übergeben wird. Generell würde ich nicht einfach einen Pointer Parameter für den Callback verwenden, sondern einen Typedef verwenden:
Delphi-Quellcode:
type
TMyCallback = procedure(Sender: TObject; A1, A2: PWideChar) of Object;
Des Weiteren würde ich aber auch generell keinen Methoden-Callback nehmen, da die
Dll ja nichtmal weiß, welches Objekt zugeordnet ist und somit den
Self
Parameter nicht sinnvoll füllen kann.
Möglich wäre in deiner Anwendung die entsprechende Methode als
class procedure Callback; static;
anzulegen. In diesem Falle verhält sie sich wie eine normale nicht-Objektgebundene Prozedur. Sehr oft haben Callbacks und deren Register-Funktionen einen Pointer Parameter, über den der Benutzer einen selbst-definierten Kontext weiterreichen kann. In diesem Falle sähe das zum Beispiel so aus:
Delphi-Quellcode:
type
TMyCallbackClass = class(TObject)
public
FIrgendwas: Integer;
public
class procedure Callback(Context: Pointer; A1, A2: PWideChar); static;
end;
...
MyCallbackClassInstance := TMyCallbackClass.Create;
MyCallbackClassInstance.FIrgendwas := 42;
SetCallback(@TMyCallbackClass.Callback, MyCallbackClassInstance) // <- 2. Parameter ist dein beliebig wählbarer Kontext
Und in der
Dll dann entsprechend
FWorkCallback(Context, 'bla', Path)
Jetzt kannst du in deiner Callback Funktion jederzeit wieder das dazugehörige Objekt ermitteln:
Delphi-Quellcode:
class procedure TMyCallbackClass.Callback(Context: Pointer; A1, A2: PWideChar);
begin
ShowMessage(IntToStr(TMyCallbackClass(Context).FIrgendwas));
end;