gpt4 book ai didi

delphi - 更换功能单元

转载 作者:行者123 更新时间:2023-12-03 15:03:37 25 4
gpt4 key购买 nike

我正在为大型 Delphi 代码库编写单元测试基础结构。我想将对 SysUtils.FileExists 中的纯函数的调用链接到“MockSysUtils.FileExists”。

编译器不支持创建具有相同接口(interface)的 SysUtils 单元。

我正在考虑的是在运行时 Hook 我的模拟函数。现在这可能吗?

还有其他建议吗?

问候,

彼得

最佳答案

运行时替换函数很困难,但通常在技术上是可行的。您需要做的“全部”是:

  • 获取相关函数的地址
  • 反汇编前 5 个字节左右(以检查 RET 指令 - 非常小的例程可能会与另一个例程相邻,从而阻止您替换它)
  • 将其页面保护(使用 VirtualProtect )更改为可写
  • 使用 JMP rel32 指令重写前 5 个字节(即 E9 )
  • 正常实现您的版本函数,确保它与您正在模拟的函数具有相同的参数和调用约定

更简单的方法是链接不同版本的 SysUtils.pas。这还需要您重新编译 RTL 和 VCL 中依赖于 SysUtils.pas 的所有单元,但这可能比上面描述的函数检测方法容易得多。

最简单的方法是语言级别的方法,您要么根本不直接依赖 SysUtils(因此可以在更高级别进行切换),要么将 uses 声明修改为有条件地引用不同的单位。

关于delphi - 更换功能单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/469237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com