加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 替换功能单元

发布时间:2020-12-15 09:49:38 所属栏目:大数据 来源:网络整理
导读:我正在为大型Delphi代码库编写单元测试基础结构.我想将SysUtils.FileExists中对纯函数的调用链接到例如“MockSysUtils.FileExists”. 编译器不支持创建具有相同接口的SysUtils单元. 我在想的是在运行时挂钩我的mock函数.现在这可能吗? 还有其他建议吗? 问
我正在为大型Delphi代码库编写单元测试基础结构.我想将SysUtils.FileExists中对纯函数的调用链接到例如“MockSysUtils.FileExists”.

编译器不支持创建具有相同接口的SysUtils单元.

我在想的是在运行时挂钩我的mock函数.现在这可能吗?

还有其他建议吗?

问候,

彼得

解决方法

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

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

更简单的方法是链接不同版本的SysUtils.pas.这将要求您还重新编译依赖于SysUtils.pas的RTL和VCL中的所有单元,但它可能比上述函数入门方法更容易.

最简单的方法是语言级方法,其中要么根本不直接依赖SysUtils(因此可以在更高级别切换),要么修改使用声明以有条件地引用不同的单元.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读