macht nichts, denn das Patchen der
RTTI ist ebenfalls nur die halbe Miete. Bei einem Zugriff wie Control.Cursor := crHourGlass benutzt der Compiler ja ebenfalls nicht die
RTTI um die Setter Methode zu ermitteln. Der Compiler erzeugt einen direkten Code wie MyControl.SetCursor() weil er ja die privaten statischen/virtuellen Methoden ja selber kennt. Nur wenn man zb. ein Control/Form im
OI ändert oder aber aus einer
DFM lädt wird die
RTL über die
RTTI gehen. Deshalb eben nur halbe Miete.
Allerdings kann er mit der
RTTI die Addresse im Codesegment ermitteln an der die private Setter Methode steht. Er patcht nun nicht mehr die
RTTI der Property sondern überschreibt den Code dr Setter Methode. Er patcht also direkt diese Methode und baut ein JMP zu seiner neuen Setter Methode rein. ALLE Controls die von der Basisklasse abgeleitet sind würden ab diesem Moment seine neue Setter Methode benutzen.
Kein schöne Sache, aber es geht alles
Gruß Hagen
PS: ich werde hier keinen fertigen Source liefern ! selber machen und lernen ist also angesagt.