最近看了java单元测试书,知道有一章说替身问题,测试里使用替身可解决很多不需要的初始化和环境构建降低复杂度,和实现自动化测试有不小意义.随后我翻了下vs2013(我现在使用的环境)有vc++支持的原生单元测试但是没有提供这个接口只有托管代码可以类似的功能.没有查到相关功能.在百度上也搜不到相关知识.

在windows下没有不可能,那么就造一个轮子吧:

/***********************************************************************************************************************
*结构名:JMPBYTE
*功能:换掉需要替身函数用自己便于的函数去实现通过写入目标地址实现跳转
*变量;jmpcode就是跳转指令
*变量:jmptag就是跳转地址
*构造函数:无参数的直接将跳转头设置E9(jmp指令)地址设置0
*有构造函数:通过给定地址直接计算出需要的函数地址可以直接通过复制指令将指令复制到目标地址
***********************************************************************************************************************/
#include <map>
#include "memoryapi.h"
using std::map;
#pragma pack(1)//1个字节对齐下钩子的数据结构,这边我jmp指令有经验的同学可以自行修改
typedef struct JMPBYTE
{
JMPBYTE(){ jmpcode = 0xe9; jmptag = 0; }
JMPBYTE(void  * fromaddress, void * toaddress)
{
jmpcode = 0xe9; 
jmptag = (void *)((char *)toaddress - (char *)fromaddress - sizeof(JMPBYTE));
}
unsigned char jmpcode;
void  *       jmptag;
}JMPTAG;
#pragma pack()

/***********************************************************************************************************************
*函数名:ChangeThisCallFun
*类名:ChangeFun
*功能:换掉需要替身函数用自己便于的函数去实现
*参数:t就是我们自己写的替身
*参数:f就是我们需要替换掉函数的地址
***********************************************************************************************************************/
class ChangeFun
{
public:
map<void  *, JMPBYTE>  m_oldcode;//保存原来的地址信息用来恢复
template<typename ToType, typename FromType>BOOL ChangeThisCallFun(ToType t, FromType f)
{
BOOL ret = FALSE;
union  funaddress
{
FromType  _f;//原始函数的地址
ToType    _t;//需要转换成目标函数的地址
void  *  address;
};
SIZE_T siz = 0;
DWORD oldprt;
funaddress  formadd, toaddr;
toaddr._t = t;
formadd._f = f;
JMPBYTE  bk, tag(formadd.address,toaddr.address);
VirtualProtectEx((HANDLE)-1, formadd.address,5, PAGE_EXECUTE_READWRITE, &oldprt);
ReadProcessMemory((HANDLE)-1, formadd.address, &bk, 5, &siz);
WriteProcessMemory((HANDLE)-1, formadd.address, &tag, 5, &siz);
VirtualProtectEx((HANDLE)-1, formadd.address, 5, oldprt, &oldprt);
return ret;
}

};

以上轮子就造好了,那么我们如何替换呢?

我现在以CTreeCtrl 类为例替换它的成员函数DeleteAllItems

首先先建立自己的类和成员函数:

class TestTree

{

BOOL  DeleteAllItems();

}

BOOL TestTree::DeleteAllItems()

{
return TRUE;
}

接着我们就去完成更换和调用吧:

void testfunadd()

{
ChangeFun testtree;
testtree.ChangeThisCallFun(&TestTree::DeleteAllItems, &CTreeCtrl::DeleteAllItems);
CTreeCtrl test;
test.DeleteAllItems();

}

本文方法属于通过自己下钩子实现替身测试功能,这个工程可以用于逆向工程和测试工程.

以上代码在vs2013中的c++工程中编译测试成功.有不对的地方肯定指正.

巧用模板和友联类型为vc++单元测试加一利器相关推荐

  1. 函数模板、 内联函数

       函数重载就是有相同的函数名但参数的个数或类型不同从而根据不同的参数个数和参数类型来调用相应的方法.    我们发现函数重载只是解决了函数命名的问题,但函数体虽然相同我们还是要重复的写,为了解决这 ...

  2. android 选择ppt模板,微软Office安卓手机版使用攻略:巧用模板可事半功倍

    微软Office安卓手机版使用攻略:巧用模板可事半功倍 2015年06月26日 15:31作者:广州分站文章出处:泡泡网原创 分享 6月25日,微软安卓手机端Office三款核心应用正式通过腾讯应用宝 ...

  3. [c++][语言语法]函数模板和模板函数 及参数类型的运行时判断

    参考:http://blog.csdn.net/beyondhaven/article/details/4204345 参考:http://blog.csdn.net/joeblackzqq/arti ...

  4. Valhalla LW2的进展–内联类型

    过去几周(2019年6月/ 2019年7月), 瓦尔哈拉计划的LW2阶段/原型最初于2018年10月提出,在面向公众的方面取得了重大进展. 在这篇文章中,我简要总结了最近发布的一些消息,文档和Valh ...

  5. Valhalla项目:LW2内联类型的初步了解

    我总结了最近在Valhalla LW2 项目 " 内联类型 "中取得的一些进展,这些进展最近在我的博客文章" Valhalla LW2进度-内联类型 "中公开了 ...

  6. Java没有友联(函数)这个概念怎么办?

    在设计程序时,为达到一个复杂的目的,需要设计多个类,有时会遇到一个类和另一个类共同合作.互相调用对方的方法这种情况.我们想让类的某些方法只是为指定的类准备,而不允许其他类访问,该如何解决呢? 通常按照 ...

  7. 多功能搜索友联自助交换多色彩皮肤网站图片本地化附带交易系统网址导航源码蜘蛛

    介绍: QQ登录 友联自助交换 友情链接交易功能 多功能搜索 ico小图标本地化 网站图片本地化 蜘蛛日志 文章评论 网站评论 自助链接匿名提交站点,添加友链访问网站自动审核通过 会员等级 VIP 付 ...

  8. java两个函数名字相同_为什么C不允许两个具有相同名称的函数/类模板,只有非类型模板参数(整数类型)的类型不同?...

    我尝试这个时编译器会出错 . 我试过VC和g . 这同样适用于函数模板和类模板(但对于函数模板,只有在实例化函数模板时才会出现编译器错误;当编译器遇到第二个类定义时,会立即出现类模板的编译器错误) . ...

  9. C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译

    1. 编写类型无关的代码 泛型代码的两个重要原则: 模板中的函数参数是const的引用. 函数体中的条件判断仅使用<比较运算. 大多数类型,包括内置类型和我们已经用过的标准库类型(除unique ...

最新文章

  1. QIIME 2教程. 23图形界面q2studio(2020.11)
  2. c# 通过API启动外部程序
  3. android 自定义dialog 定时关闭,Android编程实现自定义Dialog的大小自动控制方法示例...
  4. C#-WinForm跨线程修改UI界面
  5. 使用sshfs挂载linux远程服务器目录到windows
  6. matlab数据点降噪,matlab学习之降噪平滑算法
  7. Windows下运行linux桌面程序
  8. 在YUI3下打印Panel内容
  9. 质量评估指标:PSNR(Peak signal-to-noise ratio 峰值信噪比)
  10. 数字电路中的时钟(2) PPM 计算
  11. Mstar方案软件运行基本原理
  12. 如何把PPT幻灯片压缩到最小
  13. Android最火的框架系列(五)GreenDao
  14. 网络 || NAT策略
  15. Linux系统---Discuz论坛网站创建部署
  16. 处理数据时,对数据取对数的意义
  17. helm安装cert-manager自动化Https(1.8)
  18. 车载以太网线束测试接口的种类以及各自特点?---HFM
  19. 【硬件】标准阻值的由来
  20. bzoj2295【POJ Challenge】我爱你啊*

热门文章

  1. 皮卡丘忠实粉丝之Web实现操作系统实验(进程调度+存储管理+死锁避免银行家算法)
  2. 计算机映像缺失磁盘如何修复,重装Win10系统找不到硬盘的解决方法
  3. 使用magick 遇到 convert: Non-conforming drawing primitive definition `text'错误的解决办法...
  4. CVPR2020|比CNN更强有力,港中文贾佳亚团队提出两类新型自注意力网络
  5. 基于鸿蒙系统的APP测试技术,快来入坑
  6. Mac 移动硬盘突然自己异常退出了(一)
  7. SpringBoot实现微信登录
  8. arduino环境esp32跑freertos系统实现触摸检测及wifi控制
  9. 食饵捕食者模matlab,食饵捕食者模型
  10. 数据科学家处理小数据的7个技巧。