Announcement

Collapse
No announcement yet.

Methodenname eines Objektes zur Laufzeit ermitteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Methodenname eines Objektes zur Laufzeit ermitteln

    Hallo,

    ist es möglich, den Methodennamen eines Objektes zu ermitteln, ohne ihn fest als Konstante einzutragen? Wenn ja, wie geht das? Geht das auch bei eigenständigen Funktionen/Prozeduren ohne ein Objekt?

    Eine Lösung würde mir sehr weiterhelfen!

    Danke und Gruß

    Dirk Kampfmeier

  • #2
    Jain

    Alle published !! Methoden eines Objectes können ermittelt werden. Im Normalfall sind das z.B. Ereignisshandler eines TForms etc.

    Alle anderen Methoden (<published) und generischen Procedures/Functions können NICHT ermittelt werden. Es sei denn Du compilierst mit externen Debuginfos !

    Schau mal bei TObject.MethodeName() und TObject.MethodAddress().

    Gruß Hage

    Comment


    • #3
      Hallo Hagen,

      danke erstmal - aber

      "ShowMessage(MethodName(MethodAddress('Button1Clic k')))" gibt zwar "Button1Click" aus, aber das habe ich auch als Konstante eingeben müssen. Wie bekomme ich in einer Methode den Pointer auf diese Methode ohne den Namen einzugeben?

      Gruß Dir

      Comment


      • #4
        Jo, gute Frage )
        Das Ermitteln ist schon schwieriger. Grundsätzlich geht es darum des Stackframe auszuwerten um damit an die Rücksprungaddresses zum Caller zu gelangen. 4 Bytes davon abgezogen befindet sich "meistens" die Adresse. Leider sind aber viele Aufrufe nicht als CALL [Addresse] definiert sonder z.B. bei virtuellen Methoden oder Ereignisen werden register benutzt, z.B. CALL EAX.

        Es gibt aber eine andere Möglichkeit:
        Die aktuelle Methode kenn Self. Dadurch kann es das was TObject.MethodName macht simulieren. Zuerst CALLER ermitteln, wenns klappt Adresse nutzen, wenn nicht durch die Liste aller Methoden in der VMT des Objectes durchiterieren. Also das was Methode TObject.MethodeName macht sollte reprogrammiert werden aber so das
        die Übergebene Addresse ein Bereich von/bis darstellt.

        Ich nehme an Du brauchst das für Debuggingzwecke !?
        Schau mal bei http://www.Delphi-JEDI.org
        Dort gibt es in der JCL eine Debug Unit. Die kann Dir ALLE Functionsnamen zurückgeben, FALLS Du eine gültige *.MAP Datei mitlieferst.

        Gruß Hage

        Comment


        • #5
          Hallo Hagen!

          ...schluck... jetzt brauch ich wohl erst mal 'ne Weile --- ich melde mich wieder.

          Gruß Dir

          Comment


          • #6
            Hallo Hagen,

            nochmals DANKE für den Link JEDI.org!

            Dieses Projekt ist sehr interessant; ich werde das weiter untersuchen und verfolgen.

            Mein obiges Problem mit den Methodennamen ist zwar nicht gelöst (ich werde keine *.map-Dateien erzeugen), aber ich werde das jetzt aus Zeitgründen vorerst fallen lassen.

            Gruß Dir

            Comment

            Working...
            X