AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TVirtualMethodInterceptor

Ein Thema von Der schöne Günther · begonnen am 6. Jul 2018 · letzter Beitrag vom 10. Jul 2018
 
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

TVirtualMethodInterceptor

  Alt 6. Jul 2018, 18:25
Es wird wieder etwas esoterisch. Angenommen ich habe folgende zwei Klassen:

Delphi-Quellcode:
   TBase = class
      procedure testMethod(); virtual;
   end;

   TSub = class(TBase)
      procedure testMethod(); override;
   end;
und lasse einen TVirtualMethodInterceptor aus System.Rtti darauf los:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   obj := TSub.Create();
   interceptor := TVirtualMethodInterceptor.Create( obj.ClassType() );
   interceptor.OnAfter := interceptAfter;
   interceptor.Proxify(obj);

   obj.testMethod();
end;

procedure TForm1.interceptAfter(Instance: TObject; Method: TRttiMethod; const Args: TArray<TValue>; var Result: TValue);
begin
   if Method.CodeAddress = Addr(TBase.testMethod) then
      ShowMessage('After base method');
   if Method.CodeAddress = Addr(TSub.testMethod) then
      ShowMessage('After sub method');
end;
Dann bekomme ich leider ein ShowMessage('After base method'); . Für die OnBefore oder OnException -Handler des TVirtualMethodInterceptor verhält es sich ebenso.


Wie kann ich feststellen dass TSub.testMethod() ausgeführt wird? Ich hatte den Compiler im Verdacht dass er mir hier das inlined und es in Wirklichkeit keine virtuelle Methode ist. Wirklich prüfen und beweisen könnte ich das aber wahrscheinlich nur wenn ich mit Assemblercode lesen könnte.


PS: Leicht ähnliches Thema: https://www.delphipraxis.net/193681-...rgleichen.html
Meine Motivation ist dass halt bei einer bestimmten Methode dazwischen grätschen will und der String-Vergleich mit Method.Name echt unschön ist. Method.CodeAddress sieht da gleich viel besser aus, das funktioniert ja auch wenn jemand die Methode umbenennt.


PPS: Ich bin mir generell unsicher ob das Statement Addr(TBase.testMethod) überhaupt richtig ist. Angenommen, ich überlade testMethod(). Auf was Zeigt Addr(TBase.testMethod) dann eigentlich?

Geändert von Der schöne Günther ( 6. Jul 2018 um 18:27 Uhr)
  Mit Zitat antworten Zitat
 

 

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:12 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