`
testcs_dn
  • 浏览: 113838 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。

    6. **测试和优化**:编写测试用例验证功能是否正确工作,并根据性能需求进行优化。 了解这些概念和步骤后,开发者便能利用Java和Spring Boot通过JNA调用DLL函数,实现Java与本地库的高效交互。记得在实际项目中,...

    Dll2C.zip_Dll2C_Dll2Cxx_c++ Dll2C_c++反编译工具_动态链接库

    9. `TestWin32Dll`:测试用例,包含一些Windows平台的DLL文件,用于验证`Dll2C`的正确性和效果。 使用`Dll2C`和`Dll2Cxx`进行反编译的过程通常包括以下步骤: 1. 准备DLL文件:用户需要有一个或多个要反编译的DLL...

    C#/Python调用C动态链接库测试

    本案例聚焦于"C#/Python调用C动态链接库测试",这是一个涉及到多语言交互和系统级API调用的问题。动态链接库(DLL)是Windows操作系统中的一种共享库机制,允许多个程序共享同一段代码,节省内存并便于代码维护。...

    LabVIEW调用DLL文件实现USB HID双向通信

    **动态链接库**(Dynamic Link Library, DLL)是一种程序模块,用于封装一系列可以被多个应用程序共享的函数和资源。DLL文件的扩展名为.dll,它们通常包含C语言或其他编程语言编写的函数。DLL的主要优点包括提高代码...

    C/C++动态库生成和调用规则简单测试

    2. **动态链接测试**:编译调用动态库的源代码,生成.exe可执行文件,并确保运行时能正确加载和调用.dll文件。 3. **运行时错误检查**:测试过程中需检查常见的问题,如找不到DLL、函数名不匹配、版本不兼容等。 ...

    ApiDll明天去测试

    测试团队会使用这些文件来构建测试环境,编写测试用例,执行测试并记录结果。他们可能使用自动化测试工具如JUnit、pytest或Selenium,也可能采用手工测试方法,根据需求和项目规模来决定。 总结来说,"ApiDll明天去...

    C#语言编写的CRC校验DLL(源码)

    7. **单元测试**:为了确保CRC校验功能的正确性,源代码可能包含单元测试用例,用于验证不同输入数据下的校验结果是否符合预期。 通过学习和理解这个CRC校验DLL的源码,开发者不仅可以掌握CRC16算法的实现,还能...

    JavaExDLL.rar导入DLL测试

    6. **测试用例**:Java程序的测试部分,用于验证DLL导入和调用的正确性。这可能包括初始化DLL,调用DLL中的函数,以及验证返回结果是否符合预期。 在实际应用中,导入和使用DLL的过程可能涉及以下步骤: 1. **编写...

    CETK Tux DLL_LAB WinCE CETK学习资料

    9. **将库链接到Tux DLL**:如果测试需要使用其他库函数,这一步会指导你如何正确链接外部库,使Tux DLL能够调用所需的功能。 10. **更多内容**:未列出的具体细节可能包括错误处理、性能优化、测试报告的生成与...

    利用QTest进行单元测试的Demo

    本教程将深入探讨如何利用Qt库中的QTest框架进行单元测试,包括对普通应用程序中的类方法以及DLL(动态链接库)内部非导出类的方法进行测试。下面我们将详细讨论QTest的关键概念和实现步骤。 **QTest框架介绍** ...

    ffplay视频播放器dll

    - "MediaPlayer"和"MediaPlayerTest"可能是项目中的两个子模块,一个是主播放器的实现,另一个可能是测试用例或者示例程序,用于验证播放器功能的正确性。 - "3RDSDK"可能包含了第三方的SDK或库,这些库可能被用于...

    dll测试代码

    1. **函数调用正确性**:确保应用程序能够正确地调用DLL中的函数,传递正确的参数,并得到预期的返回结果。这通常涉及到设置测试用例,模拟各种输入情况,验证函数的行为是否符合接口定义。 2. **兼容性测试**:...

    截屏程序和DLL

    DLL(动态链接库)是Windows操作系统中的一种共享库,其中包含了可被多个程序调用的函数和资源。在本案例中,“截屏程序和DLL”可能是指一个截屏工具使用了特定的DLL文件来实现其功能,如处理图像、快速捕获屏幕等。...

    c# 提供C++测试DLL文件

    测试C++调用C# DLL的过程,一般会编写单元测试或集成测试,检查函数调用的正确性和性能。可以使用各种C++测试框架,如Google Test或 Catch2,编写测试用例来验证DLL的功能是否符合预期。 总的来说,将C#的DLL用于...

    iconv.dll 及其 lua 测试文件

    iconv.dll 是一个重要的动态链接库(Dynamic Link Library),它在Windows操作系统中用于字符编码转换。这个库由GNU项目开发,主要用于处理不同字符集之间的转换,例如从GBK转换到UTF-8,或者从UTF-8转换到其他编码...

    单元测试软件unitwareVUv1Demo

    使用unitwareVUv1Demo进行单元测试时,开发者可能会编写测试用例,通过调用相应的DLL或执行文件运行这些测试,然后查看结果以确定代码的正确性。此外,帮助文件(help.chm)会提供详细的指导,帮助开发者理解如何...

    DLL Project的源代码及测试项目

    这个测试应用程序会调用DLL中的函数,验证其正确性和性能。你可以通过这个项目来了解如何在VB(Visual Basic)环境中导入和使用DLL,以及如何编写测试用例来检查DLL的输出。 `DLL_Source.zip`则可能是DLL的原始开发...

    股票软件二次开发dll接口及示例源代码

    4. 测试是关键,需要在实际环境中反复验证功能的正确性和稳定性。 5. 了解软件的更新政策,因为新的版本可能会引入接口变更,需要及时更新代码。 总之,股票软件的DLL二次开发为金融行业提供了强大的工具,让投资者...

    Moq.dll库 下载

    Moq.dll是一个流行的.NET框架,用于进行单元测试。它是一个模拟(Mocking)库,能够帮助开发者在测试代码时创建虚拟对象,以便于隔离被测试的代码片段,从而实现更有效的单元测试。Moq这个名字来源于“Mock Objects...

Global site tag (gtag.js) - Google Analytics