AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ermitteln des Namens einer Methode zur Laufzeit
Thema durchsuchen
Ansicht
Themen-Optionen

Ermitteln des Namens einer Methode zur Laufzeit

Ein Thema von Daniel · begonnen am 14. Nov 2003 · letzter Beitrag vom 14. Nov 2003
Antwort Antwort
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#1

Ermitteln des Namens einer Methode zur Laufzeit

  Alt 14. Nov 2003, 13:44
Hallo DPler,

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


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...


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
Daniel R. Wolf
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Ermitteln des Namens einer Methode zur Laufzeit

  Alt 14. Nov 2003, 13:58
Hallo Daniel,

schau doch mal hier vorbei:

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

Gruß,

Barnti
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#3

Re: Ermitteln des Namens einer Methode zur Laufzeit

  Alt 14. Nov 2003, 15:11
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.
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Smokey
Smokey

Registriert seit: 10. Nov 2003
Ort: Puerto de la Cruz
158 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Ermitteln des Namens einer Methode zur Laufzeit

  Alt 14. Nov 2003, 16:17
Na dit klingt ja mal einfach
Greif dir ein gutes Stück Fleisch auf deinem Weg nach draussen !!!
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:10 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