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

时间:2012-04-14 19:00:46

标签: delphi delphi-xe2

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

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

Patch routine call in delphi

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

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

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

我认为关键是找到获取私有方法地址的方法。

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

1 个答案:

答案 0 :(得分:23)

下面列出的解决方案适用于Delphi Seattle以外的版本。 您可以使用class helper破解课程:

<强> 1单元

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;

FooAddress的返回值传递给您的某个修补功能,您就是金色的。

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