Eine Klassen-Methode (class function...) ist keine Static Method (gibt es in Delphi nicht). Auch sie hat einen Self-Parameter. Nur zeigt der nicht auf eine Instanz sondern auf die Klass selbst. Du kannst also in einer Klassenmethode mit Self.ClassName z.B. den Klassennamen ermitteln. Ein Self.MeineFunktion hingegen führt zu einer Schutzverletzung.
| Zitat: |
| Wie würde dass denn schematisch funktionieren mit der Funktion um die Methode herum?? Es währe mir echt wichtig! |
Du reservierst Speicher, der Ausführbar ist (VirtualAlloc) und schreibst in diesen Maschinencode, der deine Methode mit den Parametern aufruft. In dem Maschinencode steht der Self-Parameter fest codiert drinnen, wodurch diese neue "Prozedur" nur für eine einzige Klassen Instanz funktioniert.
Diesen Speicherbereich übergibst du nun der DLL Funktion.
Es kann aber auch ohne Assembler gemacht werden, wenn du die Funktion nicht mehrfach aufrufst, während sie abgearbeitet wird.
In diesem Fall reicht es, wenn du eine globale Variable anlegst, der du den Self-Parameter zuweist. Eine 2. Funktion, die du der DLL-Funktion übergibst, liest die globale Variable aus und ruft deren Methode auf.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var CurrentSelf: TMyClass;
function MyCallback(Progress: Integer): Integer; stdcall; begin if CurrentSelf <> nil then Result := CurrentSelf.UpdateProgress(Progress); end;
... begin CurrentSelf := MyObj; DllFunc(@MyCallback); end; |