白醋在生活中怎么使用 Delphi中包的妙用
Delphi中包的妙用

自动化测试框架的基础是钩子 也就是常说的HOOK机制 但这在实际的应用过程中可能会遇到一些问题
一旦要做钩子 那么就必须获取函数地址 由于我原先设计的钩子的目标函数 都是Delphi的内部函数 也就是说 这些函数在编译之后 很难找到
当然了 也是有几种方式可以找到的
将代码植入到系统中 编译的时候可以直接找到
编译的时候 带上Map文件 可以通过Map找到函数地址 测试框架以Dll的方式远程注入
Delphi中的包 可以公布这些函数的地址
前两种方式 有一个最大的缺点 在于必须为自动化测试 特别编译一个版本 虽然说可以接受 但显然不是最好的方案 第三种方案虽然好 但是前提是系统必须构建在带包编译的基础上
幸好 我们目前的测试的系统就具备这样的条件
那么 对于自动化测试框架来说 只需要随意作为一个Dll 并注入到原系统中就可以了 如果原系统提供了注入的扩展 那是最好 因为这样调试起来很方便 否则就做成远程注入 不过调试的时候只能Attach了 很麻烦
这个时候 只需要将包含自动化测试框架代码的测试用例代码 对VCL的包 带包编译 就可以做到对包中函数的HOOK了 不过这里面还是有一些细节需要注意的 原先我用的是FastCode的HOOK代码 但是在代表编译的时候就失效了 经过追查 发现代表编译和非带包编译的代码不一样 由于VCL的代码 编译到了包中 那么本Dll在调用包中的方法的时候 加上了跳转指令 简单的就是一个call操作 在包装载的时候 call后的地址会更新
经过一些探索 发现中国的cnPack()中早就针对这个问题有了解决方案 其实方法也很简单 就是判断一下是否存在地址跳转 如果有的话 就取跳转后的地址 否则取当前地址
完成了钩子后 我们就会发现 在我的测试用例的Dll中 对Bpl中的方法 进行了HOOK 请注意 这里面有一个选择 就是在Dll内部HOOK 还是在Bpl内部HOOK 在Dll内部HOOK 只需要修改跳转地址即可 钩子的方法很简单 在Bpl中HOOK 则需要修改函数代码的前 个字节 这种方法复杂 但是使得入口单一 一处修改 全面有效
自动化测试框架 就是选用的后者的HOOK方法 这样 我们在Dll中 对Bpl中的方法进行了HOOK 所有带着此包编译的DLL或者EXE 都会受到影响 而这也正是我们想要的
lishixinzhi/Article/program/Delphi/201311/24672