![]() |
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 |
Re: Ermitteln des Namens einer Methode zur Laufzeit
|
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:
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. |
Re: Ermitteln des Namens einer Methode zur Laufzeit
Na dit klingt ja mal einfach :thuimb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 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