Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修补delphi类的私有方法?_Delphi_Delphi Xe2 - Fatal编程技术网

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

如何修补delphi类的私有方法?,delphi,delphi-xe2,Delphi,Delphi Xe2,我已经阅读了这些问题和答案 但我无法解释如何修补位于另一个单元中的类的私有方法 检查此示例,我想修补条过程 Unit ThidParty; Interface Type TFoo =Class private procedure Bar; end; 我认为其中的关键是找到一种获取私有方法地址的方法 那么,如何修补delphi类的私有方法呢?下面列出的解决方案适用于delphi西雅图之前的版本。 您可以使用以下方法来破解该

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

但我无法解释如何修补位于另一个单元中的类的私有方法

检查此示例,我想修补
过程

Unit ThidParty;
Interface
   Type
      TFoo =Class
        private
           procedure Bar;
       end;
我认为其中的关键是找到一种获取私有方法地址的方法


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

下面列出的解决方案适用于delphi西雅图之前的版本。 您可以使用以下方法来破解该类:

Unit1

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 Berlin开始,这不再有效!类助手无法再访问严格保护、严格私有或私有成员。这个“特性”实际上是一个编译器错误,Embarcadero现在已经在柏林修复了它。您运气不好。

AFAIK这是不可能的,因为私有方法/过程不是VMT的一部分,因此无法通过RTTI等进行访问。可以破解此问题,但这需要您拆解另一个单元,然后执行一些指针算术和一些汇编来达到目的…另请参阅。David提到的类助手。这不是编译器中的一个漏洞吗?如果修好了怎么办?@大卫:不幸的是没有。DCP包含专用符号,但未在BPL中导出。因此编译器很乐意编译它,但在运行时,由于缺少符号,应用程序无法启动。这就是为什么这是编译器中的一个漏洞。@Stefan:我被纠正了。看起来编译器真的导出了BPL中的所有私有方法。这被认为是一个bug,从Delphi 10.1 Berlin来看,不再可能使用类帮助器访问私有成员。好的,仍然有一个可能的解决方案:
TMethod(MethodPtr)。代码:=@TTest.Foo