我已经阅读了这些问题和答案
How to change the implementation (detour) of an externally declared function
但是我无法弄清楚如何修补位于其他单元中的类的私有方法。
检查此示例我想修补Bar
程序。
Unit ThidParty;
Interface
Type
TFoo =Class
private
procedure Bar;
end;
我认为关键是找到获取私有方法地址的方法。
那么,我如何修补delphi类的私有方法?
答案 0 :(得分:23)
下面列出的解决方案适用于Delphi Seattle以外的版本。 您可以使用class helper破解课程:
<强> 1单元强>
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柏林开始,这已不再适用!类助手不能再访问严格受保护的严格私有或私有成员。这个“功能”实际上是Embarcadero现在在柏林修复的编译器错误。你运气不好。