我如何修补delphi类的私有方法?

Sal*_*dor 15 delphi delphi-xe2

我已经阅读了这些问题和答案

如何更改外部声明的函数的实现(绕行)

在delphi中调用例程调用

但我不能弄清楚如何修补位于其他单元中的类的私有方法.

检查此示例我想修补Bar程序.

Unit ThidParty;
Interface
   Type
      TFoo =Class
        private
           procedure Bar;
       end;
Run Code Online (Sandbox Code Playgroud)

我认为关键是找到一种方法来获取私有方法的地址.

那么,我如何修补delphi类的私有方法?

Dav*_*nan 23

下面概述的解决方案适用于包括Delphi Seattle在内的版本.您可以使用类助手来破解类:

单元1

type
  TTest = class
  private
    procedure Foo;
  end;
Run Code Online (Sandbox Code Playgroud)

单元2

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;
Run Code Online (Sandbox Code Playgroud)

将返回值传递FooAddress给您的一个修补函数,你就是金色的.

但是,从Delphi 10.1柏林开始,这已不再适用!类助手不能再访问严格受保护的严格私有或私有成员.这个"功能"实际上是Embarcadero现在在柏林修复的编译器错误.你运气不好.

  • 这不是编译器中的漏洞吗?如果它得到修复怎么办? (2认同)
  • 它被认为是一个错误,从Delphi 10.1 Berlin开始,不再可能通过类帮助程序访问私有成员. (2认同)