• VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性


    转自:http://blog.csdn.net/testcs_dn/article/details/27237509

    本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链接库为“JAVA调用动态链接库DLL之JNative学习”中使用的DLL,只是项目及文件名称不同。

     

    创建动态链接库项目:
    1、打开Microsoft Visual Studio 2010,选择文件->新建->项目。


    2、在新建项目窗口中选择其他语言->Visual C++->Win32。


    3、选择Win32 项目,设置名称:simpleDLL,设置解决方案名:simpleDLL。
    4、单击确定,在出现的Win32 应用程序向导的概述对话框中点击下一步。


    5、在应用程序设置中,选择应用程序类型下的DLL。


    6、勾选附加选项下的空项目。
    7、单击完成创建项目。
    向动态链接库添加类:
    1、添加新类头文件。右键单击simpleDLL项目,添加->新建项,选择头文件(.h),设置名称为simpleDLL,单击添加。


    2、添加新类源文件。右键单击simpleDLL项目,添加->新建项,选择C++ 文件(.cpp),设置名称为simpleDLL,单击添加。


    3、为新类添加内容。内容如下:

    头文件simpleDLL.h:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. //------------------ SimpleDLL.h ----------------  
    2.   
    3. #pragma once;  
    4.   
    5. //该宏完成在dll项目内部使用__declspec(dllexport)导出  
    6. //在dll项目外部使用时,用__declspec(dllimport)导入  
    7. //宏DLL_IMPLEMENT在SimpleDLL.cpp中定义  
    8. #ifdef DLL_IMPLEMENT  
    9. #define DLL_API __declspec(dllexport)  
    10. #else  
    11. #define DLL_API __declspec(dllimport)  
    12. #endif  
    13. DLL_API int add(int x, int y); //简单方法  
    14. DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);  
    15. DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);  

    源文件simpleDLL.cpp:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. //------------------ SimpleDLL.cpp ----------------  
    2.   
    3. //注意此处的宏定义需要写在#include "SimpleDLL.h"之前  
    4. //以完成在dll项目内部使用__declspec(dllexport)导出  
    5. //在dll项目外部使用时,用__declspec(dllimport)导入  
    6. #define DLL_IMPLEMENT  
    7.   
    8. #include "SimpleDLL.h"  
    9. #include<Windows.h>  
    10. #include <intrin.h>  
    11. #include <stdlib.h>  
    12. #include <string.h>  
    13.   
    14. int DLL_API add(int x, int y)  
    15. {  
    16.     return x+y;  
    17. }  
    18.   
    19. DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId)  
    20. {  
    21.     static wchar_t url[260] = { 0 };  
    22.     wcscpy_s(url, L"http://中文");  
    23.     wcscat_s(url, mgrIp);  
    24.     wcscat_s(url, L":");  
    25.     wchar_t szPort[20] = { 0 };  
    26.     _ltow_s(mgrPort, szPort, 10);  
    27.     wcscat_s(url, szPort);  
    28.     return url;  
    29. }  
    30.   
    31. DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId)  
    32. {  
    33.     static char url[260] = { 0 };  
    34.     strcpy_s(url, "http://中文");  
    35.     strcat_s(url, mgrIp);  
    36.     strcat_s(url, ":");  
    37.     char szPort[20] = { 0 };  
    38.     _ltoa_s(mgrPort, szPort, 10);  
    39.     strcat_s(url, szPort);  
    40.     return url;  
    41. }  

    创建引用动态链接库的应用程序:
    1、在解决方案上单击鼠标右键->添加->新建项目。


    2、在添加新项目中选择其它语言->Visual C++->Win32。


    3、选择Win32 控制台应用程序,设置名称:simpleDLLTest。
    4、单击确定,在出现的Win32 应用程序向导的概述对话框中点击下一步。


    5、在应用程序设置中,选择应用程序类型下的控制台应用程序。


    6、单击完成创建项目。
    在控制台应用程序中使用类库的功能:
    1、为SimpleDLLTest.cpp添加内容。如下所示:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. // SimpleDLLTest.cpp : 定义控制台应用程序的入口点。  
    2.   
    3. #include "stdafx.h"  
    4. #include "../SimpleDLL/SimpleDLL.h" //添加头文件引用  
    5. #pragma comment(lib, "..\..\SimpleDLL\Release\SimpleDLL.lib") //添加lib文件引用   
    6. #include <process.h>  
    7. #include <locale.h>  
    8.   
    9. int _tmain(int argc, _TCHAR* argv[])  
    10. {  
    11.     setlocale(LC_ALL, "chs"); //配置地域化信息为简体中文,否则打印出来的中文是乱码  
    12.     wprintf(L"getPlayUrl: %s ", getPlayUrl(L"127.0.0.1", 10087, 1));  
    13.   
    14.     printf("getUrl: %s ", getUrl("127.0.0.1", 10087, 1));  
    15.     system("pause");  
    16.     return 0;  
    17. }  

    2、引用simpleDLL项目。右键单击SimpleDLLTest项目,选择项目依赖项。


    3、依赖于窗口中勾选SimpleDLL,单击确定。

    4、设置SimpleDLLTest项目为活动项目。右键单击SimpleDLLTest项目,选择设为启动项目。


    6、生成解决方案。Debug运行结果如下:

    注意:现在创建的DLL只能由c++调用,C语言等其它语言是调用不了的!

    我们来用工具看一下,在解决方案上单击鼠标右键,在Windows资源管理器中打开文件夹

    我编译的是Release版本,所以打开Release文件夹,找到SimpleDLL.dll文件,用Depends工具打开它

    目前编译的版本对MSVCR100.DLL还有依赖,这样复制到其它没有安装VS2010的电脑上是用不了的;

    在项目上单击鼠标右键,属性:

    在左侧的配置属性中选择常规,在右侧找到MFC的使用,选择在静态库中使用MFC

    这里是修改MFC的使用,还有另一种方法:vs2010发布时去除msvcp100.dll和msvcr100.dll图解说明

    再看函数,带有一些特殊字符,这样c++之外其它语言是调用不了的;我们需要在头文件的函数声明中添加extern "C"标志,代码如下:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. //------------------ SimpleDLL.h ----------------  
    2.   
    3. #pragma once;  
    4.   
    5. //该宏完成在dll项目内部使用__declspec(dllexport)导出  
    6. //在dll项目外部使用时,用__declspec(dllimport)导入  
    7. //宏DLL_IMPLEMENT在SimpleDLL.cpp中定义  
    8. #ifdef DLL_IMPLEMENT  
    9. #define DLL_API __declspec(dllexport)  
    10. #else  
    11. #define DLL_API __declspec(dllimport)  
    12. #endif  
    13. extern "C" DLL_API int add(int x, int y); //简单方法  
    14. extern "C" DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);  
    15. extern "C" DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);  

    重新编译,再用Depends工具打开它,可以发现依赖项已经没有了,函数名称也正常了:

    参考:演练:创建和使用动态链接库 (C++)

    解决方案源码下载:http://download.csdn.net/detail/testcs_dn/7411383

  • 相关阅读:
    接口测试入门(5)----新框架重构,使用轻量级的HTTP开发库 Unirest
    接口测试入门(4)--接口自动化测试框架 / list和map用法 / 随机选取新闻 (随机数生成) / 接口相关id映射
    接口测试入门(3)--使用httpClient进行登录用例操作/set-cookies验证/ List<NameValuePair>设置post参数/json解析
    接口测试入门(2)--get和post初级请求/使用httpclient做一个获取信息list的请求(需要登录才可以)
    接口测试学习入门(1)--前期知识储备
    j2ee 使用db.properties连接mysql数据库
    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定
    mysql JDBC URL格式各个参数详解
    mysql新建数据库时的collation选择(转)
    SpringBoot MyBatis 配置多数据源 (静态多个)
  • 原文地址:https://www.cnblogs.com/x_wukong/p/4839767.html
Copyright © 2020-2023  润新知