2012-04-14 15 views
13

Ho letto queste domande e risposteCome posso applicare una patch a un metodo privato di una classe delphi?

How to change the implementation (detour) of an externally declared function

Patch routine call in delphi

ma non riesco a capire come figere patch di un metodo privato di una classe situato in anoher unità.

Verificare questo esempio Voglio applicare la patch alla procedura Bar.

Unit ThidParty; 
Interface 
    Type 
     TFoo =Class 
     private 
      procedure Bar; 
     end; 

Penso che la chiave sia trovare un modo per ottenere l'indirizzo del metodo privato.

Quindi, come posso applicare un metodo privato a una classe delphi?

+0

AFAIK questo NON è possibile in quanto i metodi/procedure privati ​​NON fanno parte del VMT e quindi non sono disponibili tramite RTTI ecc. Potrebbe essere possibile modificare questo, ma questo avrebbe bisogno di smontare l'altra unità e quindi fare qualche puntatore aritmetica più un po 'di montaggio per arrivarci ... – Yahia

+0

Vedi anche [Accedi a una proprietà protetta rigorosa di una classe Delphi?] (http://stackoverflow.com/a/8330615/576719). Aiutanti di classe come menzionato da David. –

risposta

22

La soluzione descritta di seguito funziona per le versioni fino a Delphi incluso. È possibile utilizzare un class helper per rompere la classe:

Unit1

type 
    TTest = class 
    private 
    procedure Foo; 
    end; 

Unit2

type 
    TMyTestHelper = class helper for TTest 
    function GetFooAddress: Pointer; 
    end; 

function TMyTestHelper.GetFooAddress: Pointer; 
var 
    MethodPtr: procedure of object; 
begin 
    MethodPtr := Self.Foo; 
    Result := TMethod(MethodPtr).Code; 
end; 

function FooAddress: Pointer; 
begin 
    Result := TTest(nil).GetFooAddress;//don't need to instantiate an object 
end; 

Passare il valore restituito da FooAddress a una delle vostre funzioni di permutazione e si è d'oro.

Tuttavia, a partire da Delphi 10.1 Berlino, questo non funziona più! Gli helper di classe non possono più accedere a membri privati ​​o privati ​​rigorosi, protetti, rigorosi. Questa "caratteristica" era in realtà un bug del compilatore che Embarcadero ha ora fissato a Berlino. Sei fuori di fortuna

+0

Grazie mille David. – Salvador

+2

Non è un buco nel compilatore? Cosa succede se viene riparato? –

+0

@Andreas Dipende dal design. Gli aiutanti di classe hanno lo scopo di avere accesso ai privati. Se viene 'riparato' allora dovrai usare altri mezzi per rompere i privati. –

Problemi correlati