我正在为大型 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/