修补公共非虚方法

时间:2016-07-13 10:43:21

标签: delphi delphi-7 delphi-5

我需要为整个应用程序修补一个公共方法,用我自己的方法替换它,但仍然可以从我的修补方法中调用原始方法。

我知道如何用自己的方法替换方法。 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)。到目前为止,我已经完成了大部分移植工作,但仍然遇到了一些问题。无论如何,在我完成之后,我不确定它是否能正常工作。所以可能需要替代方案。

2 个答案:

答案 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)

直接向我说:

  • 还原补丁
  • 通话方法
  • 再次应用补丁

编辑:正如其他人所指出的,这只是在单个线程中使用的有效方法。