How to access private methods without helpers?

前端 未结 6 2075
孤独总比滥情好
孤独总比滥情好 2020-11-28 06:39

In Delphi 10 Seattle I could use the following code to work around overly strict visibility restrictions.

How do I get access to private variables?



        
6条回答
  •  日久生厌
    2020-11-28 07:14

    If you don't need ARM compiler support, you can find another solution here.

    With inline asembler, you can access private field or method, easily.

    I think David's answer is better in most case, but if you need a quick solution for a huge class, this method could be more useful.

    Update(June 17): I've just noticed, I forgot to share his sample code for accessing private fields from his post. sorry.

    unit UnitA;
    
    type
      THoge = class
      private
        FPrivateValue: Integer;
        procedure PrivateMethod;
      end;
    end.
    
    unit UnitB;
    
    type
      THogeHelper = class helper for THoge
      public
        function GetValue: Integer;
        procedure CallMethod;
      end;
    
    function THogeHelper.GetValue: Integer;
    asm
      MOV EAX,Self.FPrivateValue
    end;
    
    procedure THogeHelper.CallMethod;
    asm
      CALL THoge.PrivateMethod
    end;
    

    Here is his sample code for calling private method.

    type
      THoge = class
      private
        procedure PrivateMethod (Arg1, Arg2, Arg3 : Integer);
      end;
    
    // Method 1
    // Get only method pointer (if such there is a need to assign a method pointer to somewhere)
    type
      THogePrivateProc = procedure (Self: THoge; Arg1, Arg2, Arg3: Integer);
      THogePrivateMethod = procedure (Arg1, Arg2, Arg3: Integer) of object;
    
    function THogeHelper.GetMethodAddr: Pointer;
    asm
      {$ifdef CPUX86}
      LEA EAX, THoge.PrivateMethod
      {$else}
      LEA RAX, THoge.PrivateMethod
      {$endif}
    end;
    
    var
      hoge: THoge;
      proc: THogePrivateProc;
      method: THogePrivateMethod;
    begin
      // You can either in here of the way,
      proc := hoge.GetMethodAddr;
      proc (hoge, 1, 2, 3);
      // Even here of how good
      TMethod (method) .Code := hoge.GetMethodAddr;
      TMethod (method) .Data := hoge;
      method (1, 2, 3) ;
    end;
    
    // Method 2
    // To jump (here is simple if you just simply call)
    procedure THogeHelper.CallMethod (Arg1, Arg2, Arg3 : Integer);
    asm
      JMP THoge.PrivateMethod
    end;
    
    unit UnitA;
    
    type
      THoge = class
      private
        FPrivateValue: Integer;
        procedure PrivateMethod;
      end;
    end.
    

提交回复
热议问题