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

模拟和Win32 API调用

发布时间:2020-12-14 04:11:03 所属栏目:Windows 来源:网络整理
导读:我正在使用的当前产品是用C编写的 Windows服务,并且所有新功能都将为其编写单元测试.但是这会产生一个有趣的问题(对我来说至少)我们会针对各种事情做很多Win32调用并相应地运行,所以为了完成单元测试,测试各种输出会很好,而不仅仅是当前系统州. 我的问题是模
我正在使用的当前产品是用C编写的 Windows服务,并且所有新功能都将为其编写单元测试.但是这会产生一个有趣的问题(对我来说至少)我们会针对各种事情做很多Win32调用并相应地运行,所以为了完成单元测试,测试各种输出会很好,而不仅仅是当前系统州.

我的问题是模拟Win32调用结果的最佳方法是什么?我考虑过两种不同的方法:

1)将所有使用的Win32调用放入函数指针,并将它们传递给使用它们的函数或类(取决于它们被击中的次数),并使用它来获取模拟结果.

2)到处都有很多#ifdef UNITTEST,如果它正在调用我自己的特殊方法,或者如果没有则调用正常的方法.

我完全偏离这里,还是错过了一个基本知识?

关于(2),采用字符串参数的大多数Win32函数已经将它们的公共形式定义为宏,例如,来自WinUser.h:
WINUSERAPI
int
WINAPI
MessageBoxA(
    __in_opt HWND hWnd,__in_opt LPCSTR lpText,__in_opt LPCSTR lpCaption,__in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
    __in_opt HWND hWnd,__in_opt LPCWSTR lpText,__in_opt LPCWSTR lpCaption,__in UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

您当然可以在项目中添加标题,重新定义要模拟的API函数:

#ifdef UNITTEST
#undef MessageBox
#define MessageBox UnitTestMessageBox
#endif

通过重新定义名称,您可以避免在整个源代码中散布大量条件编译.

(编辑:李大同)

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

    推荐文章
      热点阅读