微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何修补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现在在柏林修复的编译器错误.你没有运气.

原文地址:https://www.jb51.cc/delphi/102604.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐