Einzelnen Beitrag anzeigen

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