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:
- //------------------ SimpleDLL.h ----------------
- #pragma once;
- //该宏完成在dll项目内部使用__declspec(dllexport)导出
- //在dll项目外部使用时,用__declspec(dllimport)导入
- //宏DLL_IMPLEMENT在SimpleDLL.cpp中定义
- #ifdef DLL_IMPLEMENT
- #define DLL_API __declspec(dllexport)
- #else
- #define DLL_API __declspec(dllimport)
- #endif
- DLL_API int add(int x, int y); //简单方法
- DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);
- DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);
源文件simpleDLL.cpp:
- //------------------ SimpleDLL.cpp ----------------
- //注意此处的宏定义需要写在#include "SimpleDLL.h"之前
- //以完成在dll项目内部使用__declspec(dllexport)导出
- //在dll项目外部使用时,用__declspec(dllimport)导入
- #define DLL_IMPLEMENT
- #include "SimpleDLL.h"
- #include<Windows.h>
- #include <intrin.h>
- #include <stdlib.h>
- #include <string.h>
- int DLL_API add(int x, int y)
- {
- return x+y;
- }
- DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId)
- {
- static wchar_t url[260] = { 0 };
- wcscpy_s(url, L"http://中文");
- wcscat_s(url, mgrIp);
- wcscat_s(url, L":");
- wchar_t szPort[20] = { 0 };
- _ltow_s(mgrPort, szPort, 10);
- wcscat_s(url, szPort);
- return url;
- }
- DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId)
- {
- static char url[260] = { 0 };
- strcpy_s(url, "http://中文");
- strcat_s(url, mgrIp);
- strcat_s(url, ":");
- char szPort[20] = { 0 };
- _ltoa_s(mgrPort, szPort, 10);
- strcat_s(url, szPort);
- return url;
- }
创建引用动态链接库的应用程序:
1、在解决方案上单击鼠标右键->添加->新建项目。
2、在添加新项目中选择其它语言->Visual C++->Win32。
3、选择Win32 控制台应用程序,设置名称:simpleDLLTest。
4、单击确定,在出现的Win32 应用程序向导的概述对话框中点击下一步。
5、在应用程序设置中,选择应用程序类型下的控制台应用程序。
6、单击完成创建项目。
在控制台应用程序中使用类库的功能:
1、为SimpleDLLTest.cpp添加内容。如下所示:
- // SimpleDLLTest.cpp : 定义控制台应用程序的入口点。
- #include "stdafx.h"
- #include "../SimpleDLL/SimpleDLL.h" //添加头文件引用
- #pragma comment(lib, "..\\..\\SimpleDLL\\Release\\SimpleDLL.lib") //添加lib文件引用
- #include <process.h>
- #include <locale.h>
- int _tmain(int argc, _TCHAR* argv[])
- {
- setlocale(LC_ALL, "chs"); //配置地域化信息为简体中文,否则打印出来的中文是乱码
- wprintf(L"getPlayUrl: %s\r\n", getPlayUrl(L"127.0.0.1", 10087, 1));
- printf("getUrl: %s\r\n", getUrl("127.0.0.1", 10087, 1));
- system("pause");
- return 0;
- }
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"标志,代码如下:
- //------------------ SimpleDLL.h ----------------
- #pragma once;
- //该宏完成在dll项目内部使用__declspec(dllexport)导出
- //在dll项目外部使用时,用__declspec(dllimport)导入
- //宏DLL_IMPLEMENT在SimpleDLL.cpp中定义
- #ifdef DLL_IMPLEMENT
- #define DLL_API __declspec(dllexport)
- #else
- #define DLL_API __declspec(dllimport)
- #endif
- extern "C" DLL_API int add(int x, int y); //简单方法
- extern "C" DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);
- extern "C" DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);
重新编译,再用Depends工具打开它,可以发现依赖项已经没有了,函数名称也正常了:
解决方案源码下载:http://download.csdn.net/detail/testcs_dn/7411383
VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性的更多相关文章
- Java(使用JNA)调用DLL库与C#调用DLL库的对比
前言:在项目中经常使用DLL库对硬件进行操作,在发卡过程中使用频率尤为多,今天就Java与C#中调用DLL库的使用区别做一个介绍,本文着重具体的代码编写,具体过程看以下代码. 前提条件: 笔者已经封装 ...
- VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
本文将创建一个简单的动态库-link,谱写控制台应用程序使用该动态链接库,该动态链接库为"JAVA调用动态链接库DLL之JNative学习"中使用的DLL,仅仅是项目及文件名不同. ...
- LabVIEW如何方便地调用DLL文件
转自:http://bbs.elecfans.com/jishu_469502_1_1.html LabVIEW调用DLL文件 LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用.比 ...
- C++ exe调用dll文件
生成dll程序 extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,in ...
- C++ 生成 dll 和调用 dll 的方法实例(转)
1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#e ...
- 获取DLL的文件路径以及调用DLL的文件路径
如何在DLL中,获取DLL本身的路径以及调用DLL的文件的路径呢?主要通过GetModuleFileName(HMODULEhModule,LPTSTR lpFilename,DWORD nSize) ...
- C++ Builder创建和调用dll中的资源
程序开发中经常会用到一些图标.图片.光标.声音等,我们称它们为资源(Resource).当多个窗口用到同样的资源时,可以将这些公共的资源放到一个dll文件里调用,这样,由于定位资源比在磁盘中定位文件花 ...
- 摘: VS2010 C++ 调用 DLL (C++编写)
一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用. 比较常见的例子是各种应用程序框架,如ATL. ...
- C++编写 动态链接库dll 和 调用dll
参考:https://jingyan.baidu.com/article/ff42efa92c49cfc19e2202fd.html 和htps://jingyan.baidu.com/article ...
随机推荐
- 锋利的jQuery-2--一个显示和隐藏的例子,主要看写法
例子:如图,默认不显示全部,点击按钮来回切换,全部显示是一部分推荐的品牌高亮. $(function(){ //dom加载完再执行 var category = $('ul li:gt(5):not( ...
- Enterprise Library系列文章目录(转载)
1. Microsoft Enterprise Library 5.0 系列(一) Caching Application Block (初级) 2. Microsoft Enterprise Lib ...
- 一个C++类的注释:
#ifndef __RUNTIMEPARA__HPP#define __RUNTIMEPARA__HPP #include <string> //后面会有介绍 #include <m ...
- C#多线程学习 之 线程池[ThreadPool](转)
在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPo ...
- font-family属性与字体对齐
css中的font-family属性可以让我们自定义字体.在页面前端,宋体已经明日黄花,号称最贵中文字体的微软雅黑大行其道.英文字体万年不变,依然还是"arial","v ...
- 10道C++输出易错笔试题收集
下面这些题目都是我之前准备笔试面试过程中积累的,大部分都是知名公司的笔试题,C++基础薄弱的很容易栽进去.我从中选了10道简单的题,C++初学者可以进来挑战下,C++大牛也可以作为娱乐玩下(比如下面的 ...
- Flume-NG(1.5版本)中SpillableMemoryChannel源码级分析
SpillableMemoryChannel是1.5版本新增的一个channel.这个channel优先将evnet放在内存中,一旦内存达到设定的容量就使用file channel写入磁盘.然后读的时 ...
- Coursera台大机器学习技法课程笔记03-Kernel Support Vector Machine
这一节讲的是核化的SVM,Andrew Ng的那篇讲义也讲过,讲的也不错. 首先讲的是kernel trick,为了简化将低维特征映射高维特征后的计算,使用了核技巧.讲义中还讲了核函数的判定,即什么样 ...
- DBhelper封装jdbc并解决特殊字符的问题
1.测试数据库 1.1 数据库数据 1.2 数据库结构 1.3 数据库脚本 DROP TABLE IF EXISTS `school`.`student`; CREATE TABLE `school` ...
- [ruby on rails] 跟我学之(9)删除数据
首先需要在index页加个删除链接,并提供一个删除的确认,用户确认删除时,直接删除数据. 修改views 修改 app/views/posts/index.html.erb,如下: <h1> ...