15

我已阅读这些问题和答案

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

delphi中的补丁例程调用

但我无法弄清楚如何修补位于另一个单元中的类的私有方法。

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

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

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

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

4

1 回答 1

23

下面概述的解决方案适用于 Delphi Seattle 及之前的版本。您可以使用类助手来破解类:

单元1

type
  TTest = class
  private
    procedure Foo;
  end;

单元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;

将返回值传递FooAddress给您的修补函数之一,您就很成功了。

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

于 2012-04-14T19:31:33.003 回答