AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

DLL Callback Merkwürdigkeiten

Ein Thema von haentschman · begonnen am 20. Nov 2016 · letzter Beitrag vom 23. Nov 2016
 
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: DLL Callback Merkwürdigkeiten

  Alt 20. Nov 2016, 13:30
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;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (20. Nov 2016 um 13:38 Uhr)
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 22:03 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