VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性

本文将创建一个简单的动态库-link,谱写控制台应用程序使用该动态链接库,该动态链接库为“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,单击加入。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

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、在应用程序设置中。选择应用程序类型下的控制台应用程序。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />
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工具打开它

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

眼下编译的版本号对MSVCR100.DLL还有依赖。这样拷贝到其他没有安装VS2010的电脑上是用不了的;

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

这里是改动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-30 04:47:00

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性的相关文章

(备忘)vs2010编写动态链接库时导出函数的函数名问题及加载方式

在vs2010中使用.def文件导出函数时,仅仅添加.def文件是不够的,还要在 项目属性 -> 链接器 -> 输入 -> 模块定义文件 中添加自定义的.def文件名. (前提:导入导出都在头文件和源文件中定义好了) ##:静态加载动态链接库 将链接库的 头文件..lib文件 和 .dll 文件拷贝到工程目录下 然后#include 头文件,#pragma comment(lib,"**.lib") 最后直接在需要使用dll函数的地方使用函数就行 ##:动态加载动态链

用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法

问题: 在自己电脑上用VS2010编写的VC++程序(使用MFC库),不能在其他电脑上运行.双击提示: "无法启动此程序,因为计算机中丢失mfc100.dll 尝试重新安装该程序以解决此问题." 解决方案: 方案一 采用静态编译使用VS2010编译的程序在windowsxp中运行时,经常会出现找不到相关的DLL文件,我们可以使用静态编译的方法把这些运行依赖文件打包到*.exe中来,以减少对环境的依赖. 一般可以配置以下两项: 项目 -< **属性 -< 配置属性-<

[DLL] Dynamic link library (dll) 的编写和使用教程

前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容比较多: http://www.tutorialspoint.com/dll/index.htm http://www.tuicool.com/articles/ZVBnE3b http://www.cnblogs.com/cswuyg/archive/2011/10/06/DLL2.html 第三

c#编写的基于Socket的异步通信系统封装DLL--SanNiuSignal.DLL

SanNiuSignal是一个基于异步socket的完全免费DLL:它里面封装了Client,Server以及UDP:有了这个DLL:用户不用去关心心跳:粘包 :组包:发送文件等繁琐的事情:大家只要简单的几步就能实现强大的通信系统:能帮助到大家是本人觉得最幸福的事情,也希望大家 在用的过程中找出DLL中不足的地方:好改正:此DLL的苹果版和java版正在努力开发中......交流QQ:365368248:此演示源码下载地址:http://pan.baidu.com/s/1eQw1npw 里面包括

VS2010环境下用ANSI C创建DLL和使用方法(转)

源:VS2010环境下用ANSI C创建DLL和使用方法 1. 创建DLL工程 1.1 启动VS 2010 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程名称,这里我们用dll,点击确定按钮. c.点击下一步,在"应用程序设置界面设置"勾选DLL(D)项和空项目,点击完成按钮. d.视图->解决方案资源管理器,右键点击"头文件",添加->新建项,这里咱们用dll.h 右键点击&q

dll的概念、dll导出类

随笔- 64  文章- 0  评论- 37 dll的概念.dll导出类(转) 1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与动态链接库都是共享代码的方式.静态链接库把最后的指令都包含在最终生成的EXE文件中了:动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件. (2)静态链接库中不能再

DLL的概念、dll导出类(转贴)

1. DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用.静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式.静态链接库把最后的指令都包含在最终生成的EXE文件中了:动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件.(2) 静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库.

MinGW 创建的程序或 DLL 脱离 libgcc-xx-xx.dll 和 libstdc++-x.dll 运行库的方法

MinGW 沿袭了 Linux 下 gcc/g++ 的习惯,编译出的程序或者动态链接库(共享库)总是默认采用动态链接方式,需要系统中附带运行时库文件 libgcc-xx-xx.dll 和 libstdc++-xx.dll.那么如果我们不想发布程序时还要附带这两个运行库,该如何操作呢?通过参考 gcc/g++ 用户手册,发现只需要在编译器或链接器参数设置中使用 -static-libgcc 和 -static-libstdc++ 即可实现对这两个运行库的静态库链接,不必附带运行库了.如果采用参数

Window phone应用中的多触点手势解读以及toolKit.dll和Microsoft.Phone.dll 冲突问题

我最近在在写一个windowphone应用,应用中有关于单点触控,多点触控的需要.如点击,双击,滑动,双指滑动等,在这个过程中遇到了一些问题,在这里分享一下我的心得. 首先对windowphone的触控的各种方法做一下总结分析,我对此处问题大部分来自一Charles Petzold先生的解读,在此对Charles Petzold先生表示感谢. 手势服务和侦听器 首先您需要安装 Windows Phone 7 开发工具,当然,还有 Silverlight for Windows Phone 工具包