![]() |
Methodenaufruf umbiegen?
Hi,
Ich komme einfach direkt zum Punkt:
Delphi-Quellcode:
Ist es möglich einen Aufruf von GetTest auf GetTest2 umzubiegen?
TTest = class
function GetTest: String; function GetTest2: String; end; |
Re: Methodenaufruf umbiegen?
Mit ein wenig Umweg:
Delphi-Quellcode:
Und die Zuweisungen kannst du zur Runtime beliebig umherwürfeln. Ich bin mir grad nur unsicher, ob die Syntax für TMyFunc so geht, bislang hatte ich irgendwie immer nur procedure of object genutzt :)
type
TMyFunc = function: String of object; TMyClass private function FFunc1: String; function FFunc2: String; public GetText: TMyFunc; GetText2: TMyFunc; end; implementation constructor TMyClass(...) begin GetText := FFunc1; GetText2 := FFunc2; end; |
Re: Methodenaufruf umbiegen?
Hi,
Ich habs wohl zu allgemein ausgedrückt.. Auf die Struktur der Klasse habe ich letztendlich keinen Einfluss. Genauer gesagt habe ich soetwas:
Delphi-Quellcode:
Diese Klasse ist jetzt auch fest. Daran darf im Code nichts geändert werden.
TBeispiel = class
private FText: String; function GetText: String; public property Text: String read GetText; end; Was ich jetzt per RTTI rausfinden kann sind die Properties. Ich hab den Namen der Property und die Pointer zu der jeweiligen Getter und Setter Methode. Was ich jetzt prinzipiell will ist GetText zu "hooken". So in der Art:
Delphi-Quellcode:
function GetTextHook(Self: TBeispiel): String;
begin Result := Self.GetText + '_Hooked!'; end; HookProperty(TBeispiel,'Test',mkGetter,@GetTextHook); |
Re: Methodenaufruf umbiegen?
Wie wäre es mit einer Ableitung der Klasse, die alles wie ihr Vorfahr durchreicht, aber die Property überdeckt und auf decorator-artige Weise erweitert? (Ich weiss nur grad nicht so 100%ig ob sich Properties überhaupt verdecken lassen...)
|
Re: Methodenaufruf umbiegen?
Wenn du das hooken willst, musst du das ganz klassisch machen, also einen Jump bzw. Call an den Anfang des Methodencodes schreiben.
|
Re: Methodenaufruf umbiegen?
Zitat:
Code:
(gut, man darf dieses jetzt nicht wörtlich nehmen, denn es würde eine kleine Endlosschleife entstehen :stupid: )
result := [color=#ff0000]Self.GetText[/color] + '_Hooked!';
|
Re: Methodenaufruf umbiegen?
Zitat:
Zitat:
|
Re: Methodenaufruf umbiegen?
Es geht aber nicht anders. Eigenschaften existieren im Kompilat nur noch als RTTI, die Aufrufe selbst sind nur noch Methodenaufrufe bzw. Feldzugriffe. Zum Hooken musst du dir irgendeine Grenze zwischen Anweisungen suchen. Das ist ein bisschen schwierig, weil du dazu schon fast Maschinencode parsen musst. Quick & Dirty geht es aber meistens, schau dir einfach mal an, was für Code der Delphi-Compiler im Prolog generiert.
|
Re: Methodenaufruf umbiegen?
Das hier:
Delphi-Quellcode:
allerdings ist da halt wirklich nicht viel Platz... :?
push ebx
mov ebx, edx // Result := 'Test'; mov eax, ebx mov edx, $004D6A10 call UStrAsg // end; pop ebx ret Das sind also 3 Bytes bevor der "Result := 'Test'"-Teil kommt... etwas wenig.. |
Re: Methodenaufruf umbiegen?
Zitat:
Edit: Alles andere liefe auf recht unschönes Gehacke in der Methodentabelle hinaus, was nicht nur extrem unelegant ist, sondern aufgrund der Freiheit die ein Compiler da hat auch praktisch unportierbar - möglicherweise eben auch innerhalb der Delphiversionen. Evtl. können wir besser hier weiter machen, wenn du konkret vorstellst, was du möchtest, und vor allem in welchem Kontext. Die bisherigen Beispiele waren offenbar zu stark minimiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:46 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 by Thomas Breitkreuz