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

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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

创建动态链接库项目:

1、打开Microsoft Visual Studio 2010,选择文件->新建->项目。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
2、在新建项目窗体中选择其他语言->Visual C++->Win32。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
3、选择Win32 项目,设置名称:simpleDLL。设置解决方式名:simpleDLL
4、单击确定。在出现的Win32 应用程序向导的概述对话框中点击下一步。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
5、在应用程序设置中,选择应用程序类型下的DLL。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
6、勾选附加选项下的空项目。
7、单击完毕创建项目。
向动态链接库加入类:
1、加入新类头文件。右键单击simpleDLL项目,加入->新建项,选择头文件(.h),设置名称为simpleDLL,单击加入。

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

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

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

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、在解决方式上单击鼠标右键->加入->新建项目。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
2、在加入新项目中选择其他语言->Visual C++->Win32。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
3、选择Win32 控制台应用程序。设置名称:simpleDLLTest。

4、单击确定。在出现的Win32 应用程序向导的概述对话框中点击下一步。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
5、在应用程序设置中。选择应用程序类型下的控制台应用程序。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
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项目。选择项目依赖项。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
3、依赖于窗体中勾选SimpleDLL。单击确定。

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

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

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
6、生成解决方式。

Debug执行结果例如以下:

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

注意:如今创建的DLL仅仅能由c++调用,C语言等其他语言是调用不了的!

我们来用工具看一下,在解决方式上单击鼠标右键。在Windows资源管理器中打开目录

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

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

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

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

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

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

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

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

这里是改动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工具打开它,能够发现依赖项已经没有了。函数名称也正常了:

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

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

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

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117539.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Linux 小知识翻译 – 「/proc 文件夹」

    Linux 小知识翻译 – 「/proc 文件夹」

  • Layui二级菜单优化

    Layui二级菜单优化刚开始学习layui框架,碰到一个缺陷是二级菜单每次点击都会收缩到原始状态。用 Request.Url.ToString();获取URL判断点击页面前哪些节点是展开的,添加class=\"layui-nav-itemlayui-nav-itemed\"&gt;(展开子节点)解决了。代码如下:for(vari=0;i&lt;data.length;i++){…

  • 数组截取splice_splice返回值

    数组截取splice_splice返回值Javascript数组的splice方法介绍splice()方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。语法格式array.splice(start[,deleteCount[,item1[,item2[,…]]]])参数start必选指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于

  • java常见面试题及答案 11-20(JVM)

    11.JVM内存分哪几个区,每个区的作用是什么?java虚拟机主要分为以下一个区:方法区:1.有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载2.方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。3.该区域是被线程共享的。4.方法区里有

  • 微信授权登录报错40029

    微信授权登录报错40029最近傻屌app微信授权登录报错40029,查看了很长时间,最后发现,是后端代码配置的appid和app那边配置的appid不一样导致的,如果出现这种报错,一方面查看code是否被使用,还有就是这种配置文件是不是一样的了。{“errcode”:40029,”errmsg”:”invalidcode,hints:[req_id:bHlBdZyFe-tOmSea]”}…

  • 获取股票历史数据(网易163行情接口)[通俗易懂]

    获取股票历史数据(网易163行情接口)获取股票历史数据,通过网易163接口来获取数据,可以获取指数数据,也可以获取股票数据importpandasaspd#沪市前面加0,深市前面加1,比如0000001,是上证指数,1000001是中国平安defget_daily(code,start=’19900101′,end=”):url_mod=”http://quotes.money.163.com/service/chddata.html?code=%s&start=%s

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号