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

本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链接库为“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工具打开它,可以发现依赖项已经没有了,函数名称也正常了:

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

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

时间: 2024-10-27 23:16:04

VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性的相关文章

dll动态库-python 调用DLL 动态库之后 怎么释放

问题描述 python 调用DLL 动态库之后 怎么释放 各位大神,请问python 利用 ctypes调用DLL之后怎么释放啊 解决方案 不需要释放,CDLL析构中会自动释放

dll结构体-C#调用DLL结构体,第一次成功,第二次的时候就报错。尝试读取或写入受保护的内存。

问题描述 C#调用DLL结构体,第一次成功,第二次的时候就报错.尝试读取或写入受保护的内存. C++代码 typedef struct tagIDCardData{ char Name[32]; //姓名 char Sex[6]; //性别 char Nation[20]; //名族 char Born[18]; //出生日期 char Address[72]; //住址 char IDCardNo[38]; //身份证号 char GrantDept[32]; //发证机关 char User

DLL中使用LoadLibrary调用DLL失败的问题

问题描述 TestDLL里使用extern"C"__declspec(dllexport)intMyFunc()导出一个函数MyFunc;我在TestDLLApp里使用[DllImport("TestDLL.dll")]int__stdcallMyFunc()导入后这个函数.把生成的TestDLL.dll拷贝到TestDLLApp.exe文件一起,运行TestDLLApp.exe发现是没有问题的,也能得到MyFunc函数的返回值.现在在TestDLL的函数MyFun

dll窗体及数据调用-delphi DLL数据及窗体调用

问题描述 delphi DLL数据及窗体调用 DLL工程文件代码: library DLLUSERS; uses Windows, ADODB, Dialogs, Forms, SysUtils, Classes, U_DataModule in 'U_DataModule.pas' {DataModule1: TDataModule}, U_Users in 'U_Users.pas' {Frm_Users}, U_Initialize in 'U_Initialize.pas'; {$R *

java中如何调用DLL方法

前段时间项目需要使用调用DLL来控制POS机外设,如钱箱和小票打印机.顾客显示屏等,于是,我便开始了java调用DLL中的方法的探索,事实上,网上的例子还是很多的,一些外部包的例子也有很多,但每个人的实际情况都有所不同,尽管只是一个很简单的调用,也花了我不少时间,在这里分享一下我的经验吧. 我是通过一个外部的JAR包来间接来获得DLL文件的句柄 的,它就是jacob了,这是java com brige的简写,呵呵, 这个名称起得非常形象吧,我用的版本是jacob 1.9的,你可以到它的官方网站去

C++生成dll和调用dll的方法实例_C 语言

本人根据网络多个相关博客帖子原创 1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#else#define EXPORT __declspec(dllimport)#endif extern "C"{EXPORT void example(void);... ...} xxx.cpp内容如下: #define BUILD_XXX_DLL#i

我用opencv2.4编写了一个算法并生成了.DLL ,并在我电脑上用C#调用成功, 但在没有安装opencv2.4.9电脑上用C#使用, 请问怎把用到的op

问题描述 我用opencv2.4.9+VS2010平台上用C++编写了一个算法并生成了.DLL,并在我电脑上用C#调用成功,但是在没有安装opencv2.4.9的电脑上用C#使用,请问怎把用到的openCV库里的.DLL也一起封装到我要生成的算法代码的DLL中,让其他没有安装opencv2.4.9的电脑的C#调用?谢谢指教,不胜感激! 解决方案 解决方案二:大家有好的方法,可以发我邮箱3044757309@qq.com,谢谢大家了,不胜感激......解决方案三:1.不要嫌麻烦,把opencv的

C 编写动态链接库PHP DLL

新建->工程->win32 Dynamic Link Library->一个简单的dll工程 只有在函数前标注:extern   "C"   _declspec(dllexport) 的函数才能被其他的程序通过 dll 的方式调用 Java代码   extern "C" _declspec(dllexport) int add(int i1,int i2){       return i1+i2;   }   (1) 静态链接声明: Java代码 

qt c++-关于QT中调用dll动态链接库的问题

问题描述 关于QT中调用dll动态链接库的问题 10C 我现在有.lib .h .dll三个文件 想在QT中调用动态链接库使用相关函数,借用相关网上的教程,但是老是出错.求大神指点!!!!最后一个是教程,哪里出了问题呢? 解决方案 试试让QT自己生成:右键项目--添加库--外部库 解决方案二: C++ 调用C++动态链接库dllJNI java调用动态链接库dllqt 动态链接库dll 解决方案三: 没看清出了什么错误,是串口初始化的错误么? 解决方案四: 看看错误地方是否正确初始化变量 解决方