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

前端之家收集整理的这篇文章主要介绍了我如何修补delphi类的私有方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经阅读了这些问题和答案

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类的私有方法

解决方法

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

单元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柏林开始,这不再奏效了!班级助理员不能再访问严格的受保护,严格的私人或私人会员.这个“功能”实际上是Embarcadero现在在柏林修复的编译器错误.你没有运气.

猜你在找的Delphi相关文章