Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Adresse einer privaten Methode bekommen (https://www.delphipraxis.net/153041-adresse-einer-privaten-methode-bekommen.html)

Win32.API 18. Jul 2010 21:51

Delphi-Version: 2010

Adresse einer privaten Methode bekommen
 
Hallo,

ist es möglich die Adresse einer privaten Methode zur Laufzeit zu bestimmen? Eine "Hack"/"Dummy"-Klasse kommt in diesem Fall nicht in Frage, da der Code für mehrere Versionen der Klasse arbeiten soll.

Ich habe gedacht, dass das bestimmt mit der RTTI geht, aber
Delphi-Quellcode:
TRttiType.GetMethod()
gibt leider für private Methoden immer nil zurück.

Es muss aber einen Weg geben, da Delphi in der CPU-Ansicht den Namen anzeigen kann. Es ist auch möglich per Name zu dieser Funktion zu springen.

Grüße,
Win32.API

Luckie 18. Jul 2010 21:54

AW: Adresse einer privaten Methode bekommen
 
Wozu brauchst du die Adresse einer privaten Methode?

Namenloser 18. Jul 2010 21:56

AW: Adresse einer privaten Methode bekommen
 
Funktioniert
Delphi-Quellcode:
TMyClass.MethodAddress('MyMethod')
?

mkinzler 18. Jul 2010 21:57

AW: Adresse einer privaten Methode bekommen
 
Das würde ja dem Prinzip des information hiding ( black box) widersprechen

rollstuhlfahrer 18. Jul 2010 21:57

AW: Adresse einer privaten Methode bekommen
 
Das Ganze scheitert schon am Konzept. Du kannst nicht die Adresse einer privaten Prozedur auslesen. Eine private Prozedur ist vom Konzept her (ähnlich wie protected) nur INNERHALB eines Objektes verwendbar. Du kannst sie also auch nicht von außen aufrufen, weil es so aussieht, als würde sie gar nicht existieren. Somit kann sie von RTTI nicht gefunden werden.

Bernhard

Namenloser 18. Jul 2010 22:01

AW: Adresse einer privaten Methode bekommen
 
Delphi-Quellcode:
MethodAddress
liest aber direkt die VMT aus.

Win32.API 18. Jul 2010 22:06

AW: Adresse einer privaten Methode bekommen
 
Vielen Dank für die raschen Antworten :thumb:!

Ich brauche die Adresse um einen Bug in der Komponente zu beseitigen. Mir ist auch klar, dass es gegen das Konzept von OOP geht. Aber leider lässt es sich in diesem Fall nicht verhinden.

Delphi-Quellcode:
TMyClass.MethodAddress('MyMethod')
gibt leider auch nil zurück.

Alle Methoden, egal ob privat oder public, sind nur innerhalb einer Object-Instanz verwendbar (Class Functions/Procesdures und Hacks ausgeschlossen). Ich will sie auch nicht aufrufen sondern sie Hooken.


//Win32.API

mkinzler 18. Jul 2010 22:09

AW: Adresse einer privaten Methode bekommen
 
Zitat:

Alle Methoden, egal ob privat oder public, sind nur innerhalb einer Object-Instanz verwendbar (Class Functions/Procesdures und Hacks ausgeschlossen).
Public Methoden sind von ausserhalb aufrufbar.

Hast du den Source der Komponente?

Bernhard Geyer 18. Jul 2010 22:10

AW: Adresse einer privaten Methode bekommen
 
Zitat:

Zitat von Win32.API (Beitrag 1036066)
Ich brauche die Adresse um einen Bug in der Komponente zu beseitigen.

Und wie wäre es den Fehler zu beheben?

Win32.API 18. Jul 2010 22:13

AW: Adresse einer privaten Methode bekommen
 
Zitat:

Zitat von mkinzler (Beitrag 1036069)
Zitat:

Alle Methoden, egal ob privat oder public, sind nur innerhalb einer Object-Instanz verwendbar (Class Functions/Procesdures und Hacks ausgeschlossen).
Public Methoden sind von ausserhalb aufrufbar.

Hast du den Source der Komponente?

Ich wollte formulieren, dass Methoden nur aus einer Objekt-Instanz heraus aufrufbar sind. (MyObj.Test <> TMyObj.Test)

Nein, der Source liegt leider nicht vor.

Zitat:

Zitat von Bernhard Geyer (Beitrag 1036071)
Zitat:

Zitat von Win32.API (Beitrag 1036066)
Ich brauche die Adresse um einen Bug in der Komponente zu beseitigen.

Und wie wäre es den Fehler zu beheben?

Die Funktion sollte immer True zurück geben, durch einen Bug wird unter bestimmten Umständen false zurück gegeben, was die weitere Verarbeitung behindert.

Also muss an die Funktions Adresse ein:

Code:
xor eax, eax
add eax, 1
retn
gepatch werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 Uhr.
Seite 1 von 3  1 23      

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