我需要为整个应用程序修补一个公共方法,用我自己的方法替换它,但仍然可以从我的修补方法中调用原始方法。
我知道如何用自己的方法替换方法。 How to change the implementation (detour) of an externally declared function
这是另一个例子:Make Disabled Menu and Toolbar Images look better?
但我不知道的是如何先打电话给原版。 e.g。
// Store the original address of the method to patch
var OriginalMethodBackup: TXRedirCode;
// this is the implementation of the new method
procedure MyNew_Method(Self: TObject; Index: Integer);
begin
try
// some code here
call ORIGINAL public method here
finally
// some code here
end;
end;
编辑:我尝试过Delphi Detours库,但它不会在D5和D7下编译。存在许多问题,例如指针算法,未知类型,类变量,未知的编译器指令,未知的asm指令等等......应该移植代码以支持D5和D7(奇怪的是作者声明它支持D7)。到目前为止,我已经完成了大部分移植工作,但仍然遇到了一些问题。无论如何,在我完成之后,我不确定它是否能正常工作。所以可能需要替代方案。
答案 0 :(得分:3)
如果要更改非虚拟方法,则需要修补方法。
您可以使用Delphi Detours library:
修补例行程序type
TMyMethod = procedure(Self: TObject; Index: Integer);
var
OldMethod: TMyMethod; //make sure to initialize to nil.
procedure MyNewMethod(Self: TObject; Index: Integer);
begin
Assert(Assigned(OldMethod),'Error: MyMethod is not hooked');
//If you need to call the OldMethod you can use the variable.
OldMethod(Self, Index);
//Do additional stuff here
ShowMessage('New stuff');
end;
procedure DoHook;
begin
@OldMethod:= InterceptCreate(@MyOriginalMethod, @MyNewMethod);
end;
procedure RemoveHook;
begin
if Assigned(OldMethod) then
begin
InterceptRemove(@OldMethod);
OldMethod := nil;
end;
end;
指向DDetours is here的Wiki的链接。
虽然该方法已修补,但您可以调用OldMethod
来访问原始方法。
答案 1 :(得分:0)
直接向我说:
编辑:正如其他人所指出的,这只是在单个线程中使用的有效方法。