我已经阅读了下面这些问题和答案:
但是我无法想出如何修补位于另一个单元中的类的私有方法。
请查看此示例,我想要修补Bar
过程。
Unit ThidParty;
Interface
Type
TFoo =Class
private
procedure Bar;
end;
我认为关键是找到获取私有方法地址的方式。
那么,我如何对 Delphi 类的私有方法进行修补?
我已经阅读了下面这些问题和答案:
但是我无法想出如何修补位于另一个单元中的类的私有方法。
请查看此示例,我想要修补Bar
过程。
Unit ThidParty;
Interface
Type
TFoo =Class
private
procedure Bar;
end;
我认为关键是找到获取私有方法地址的方式。
那么,我如何对 Delphi 类的私有方法进行修补?
Unit1
type
TTest = class
private
procedure Foo;
end;
第二单元
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开始,这不再起作用!类帮助程序不能再访问strict protected、strict private或private成员。实际上,这是Embarcadero在Berlin修复的编译器错误,而不是一项“功能”。您没那么幸运了。
TMethod(MethodPtr).Code := @TTest.Foo;
- LU RD只需使用类拦截重新定义方法,它可以在 Rad 10.4 之前工作。