Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ermitteln des Namens einer Methode zur Laufzeit (https://www.delphipraxis.net/11819-ermitteln-des-namens-einer-methode-zur-laufzeit.html)

Daniel 14. Nov 2003 12:44


Ermitteln des Namens einer Methode zur Laufzeit
 
Hallo DPler,

bin heute auf dieses Forum gestoßen und hab' da mal 'ne Frage ... :mrgreen:


Gibt es einen (einfachen) Weg, daß eine Methode ihren eigenen Methodennamen ermitteln kann? Vergleichbar zu TObject.Classname, wo mir ein Objekt den Namen seiner eigenen Klasse verraten kann.
Schaue ich mir das Methodenprotokoll von TObject an, so finde ich sehr wohl eine Methode "MethodName()" - daraus schließe ich, daß diese Info prinzipiell verfügbar sein muss. Um diese Methode zu nutzen bräuchte ich jedoch einen Pointer auf meine eigene Methode...
:gruebel:

Hintergrund ist der, daß ich zu Debugging-Zwecken einem eigenen Error-Handler gerne mit auf den Weg geben würde, in welcher Methode ein Fehler aufgetreten ist. Natürlich kann ich das auch per Hand als String reinschreiben und mitgeben, aber eine automatisierte Lösung wäre mir lieber.


Grüße,
Daniel

barnti 14. Nov 2003 12:58

Re: Ermitteln des Namens einer Methode zur Laufzeit
 
Hallo Daniel,

schau doch mal hier vorbei:

http://www.urimont.com/index.php?page=delphi

Gruß,

Barnti

choose 14. Nov 2003 14:11

Re: Ermitteln des Namens einer Methode zur Laufzeit
 
Hallo Daniel,

eine pute Delphi-Lösung ist mir leider nicht bekannt. Ohne Debug-Informationen kenne ich ebenfalls nur TObject.MethodName. Unter Zuhilfenahme von ASM fällt mir dann diese Möglichkeit ein:
  1. Ermitteln der Rücksprungadresse
  2. Lesen des Opcodes vor dieser Rücksprungadresse
  3. Interpretation (des Calls), um Zieladresse zu ermitteln

Sie hat leider die Nachteile, dass Methoden (theoretisch) auch "untypisch" aufgerufen werden können (Kaskadieren über Jumps, Verbiegen der Rücksprungadresse,...) und Du nicht zu jedem Zeitpunkt innerhalb der Routine davon ausgehen kannst, dass alle Register korrekt gesetzt sind.

Eine Andere (BruteForce-)Variante währe vielleicht mithilfe des Wissens um die Klasse, und der aktuellen Adresse im Code (EIP) zu probieren, welches die dichteste Methoden-Adresse vor dem testenden Stück Code ist.
Weil aber die Methoden-Adressen der RTTI nur im published-Scope abgelegt werden, könntest Du bei dieser Methode aber einige Methoden "übersehen", während es bei der vorherigen Version nur einen Leer-String zur Folge hättest (Falsche Information vs. Keine Information).

Als Gängige Methode kenne ich nur den Einsatz eines Präprozessors in mehr oder weniger gut integrierten Umgebungen. Falls Du mit ModelMaker arbeiten solltest, könntest Du den Code mit Instrumentation Code mithilfe der beiden Makros "MethodEnterInstrumentation" und "MethodExitInstrumentation" hinbekommen, ohne dass Du speziellen Code einfügen brauchst. Die anderen Präprozessoren, die mir für Delphi bekannt sind, müssen jeweils als "externe Tools" gestartet werden.

Smokey 14. Nov 2003 15:17

Re: Ermitteln des Namens einer Methode zur Laufzeit
 
Na dit klingt ja mal einfach :thuimb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz