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

  1. //------------------ SimpleDLL.h ----------------
  2.  
  3. #pragma once;
  4.  
  5. //该宏完成在dll项目内部使用__declspec(dllexport)导出
  6. //在dll项目外部使用时,用__declspec(dllimport)导入
  7. //宏DLL_IMPLEMENT在SimpleDLL.cpp中定义
  8. #ifdef DLL_IMPLEMENT
  9. #define DLL_API __declspec(dllexport)
  10. #else
  11. #define DLL_API __declspec(dllimport)
  12. #endif
  13. DLL_API int add(int x, int y); //简单方法
  14. DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);
  15. DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);

  

源文件simpleDLL.cpp:

  1. //------------------ SimpleDLL.cpp ----------------
  2.  
  3. //注意此处的宏定义需要写在#include "SimpleDLL.h"之前
  4. //以完成在dll项目内部使用__declspec(dllexport)导出
  5. //在dll项目外部使用时,用__declspec(dllimport)导入
  6. #define DLL_IMPLEMENT
  7.  
  8. #include "SimpleDLL.h"
  9. #include<Windows.h>
  10. #include <intrin.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. int DLL_API add(int x, int y)
  15. {
  16. return x+y;
  17. }
  18.  
  19. DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId)
  20. {
  21. static wchar_t url[260] = { 0 };
  22. wcscpy_s(url, L"http://中文");
  23. wcscat_s(url, mgrIp);
  24. wcscat_s(url, L":");
  25. wchar_t szPort[20] = { 0 };
  26. _ltow_s(mgrPort, szPort, 10);
  27. wcscat_s(url, szPort);
  28. return url;
  29. }
  30.  
  31. DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId)
  32. {
  33. static char url[260] = { 0 };
  34. strcpy_s(url, "http://中文");
  35. strcat_s(url, mgrIp);
  36. strcat_s(url, ":");
  37. char szPort[20] = { 0 };
  38. _ltoa_s(mgrPort, szPort, 10);
  39. strcat_s(url, szPort);
  40. return url;
  41. }

  

创建引用动态链接库的应用程序:
1、在解决方案上单击鼠标右键->添加->新建项目。


2、在添加新项目中选择其它语言->Visual C++->Win32。


3、选择Win32 控制台应用程序,设置名称:simpleDLLTest。
4、单击确定,在出现的Win32 应用程序向导的概述对话框中点击下一步。


5、在应用程序设置中,选择应用程序类型下的控制台应用程序。


6、单击完成创建项目。
在控制台应用程序中使用类库的功能:
1、为SimpleDLLTest.cpp添加内容。如下所示:

  1. // SimpleDLLTest.cpp : 定义控制台应用程序的入口点。
  2.  
  3. #include "stdafx.h"
  4. #include "../SimpleDLL/SimpleDLL.h" //添加头文件引用
  5. #pragma comment(lib, "..\\..\\SimpleDLL\\Release\\SimpleDLL.lib") //添加lib文件引用
  6. #include <process.h>
  7. #include <locale.h>
  8.  
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11. setlocale(LC_ALL, "chs"); //配置地域化信息为简体中文,否则打印出来的中文是乱码
  12. wprintf(L"getPlayUrl: %s\r\n", getPlayUrl(L"127.0.0.1", 10087, 1));
  13.  
  14. printf("getUrl: %s\r\n", getUrl("127.0.0.1", 10087, 1));
  15. system("pause");
  16. return 0;
  17. }

  

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"标志,代码如下:

重新编译,再用Depends工具打开它,可以发现依赖项已经没有了,函数名称也正常了:

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

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

【DLL测试】为DLL项目建立测试的更多相关文章

  1. DLL入门浅析(1)——如何建立DLL

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90619.html 初学DLL,结合教程,总结一下自己的所得,希望对DLL初学者们有所帮 ...

  2. Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率

    测试 目前主流的就bdd和tdd,自己查一下差异 推荐 mocha和tape 另外Jasmine也挺有名,angularjs用它,不过挺麻烦的,还有一个选择是qunit,最初是为jquery测试写的, ...

  3. robotium 测试APK<一> 建立测试工程

    1.准备Android开发环境 2.准备签名工具http://www.troido.de/re-sign.jar 1.建立测试工程 打开Eclipse,点击File->New一个Android ...

  4. Go项目的测试代码3(测试替身Test Double)

    上一篇文章介绍了项目中测试代码的写法. Go项目的测试代码2(项目运用) 这里简单的共享一下测试替身. 当我们写测试代码的时候,经常遇到一个问题.跟别的模块或服务有依赖性,可是功能还没开发完.或是因为 ...

  5. Go项目的测试代码2(项目运用)

    上一篇文章介绍了最基本的测试代码的写法.Go项目的测试代码(基础) 这里简单的共享一下我在项目中使用的方式. 项目结构 我们实际项目中, 结构简单地分了控制层controllers和模块层models ...

  6. Web项目后台测试流程

    1. 本地下载项目源码 1. Git clone项目代码到本地(本地项目代码1)并fetch: 2. Switch到master分支: 3. Create测试分支(例如:test1)并勾选“Switc ...

  7. spring boot项目如何测试,如何部署

    有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...

  8. 大数据项目测试<二>项目的测试工作

    大数据的测试工作: 1.模块的单独测试 2.模块间的联调测试 3.系统的性能测试:内存泄露.磁盘占用.计算效率 4.数据验证(核心) 下面对各个模块的测试工作进行单独讲解. 0. 功能测试 1. 性能 ...

  9. Maven入门-运行struts项目进行测试(三)

    maven运行struts项目进行测试: 在入门二中已经导入struts的jar包. 此时的pom.xml文件 <project xmlns="http://maven.apache. ...

随机推荐

  1. 十大关系数据库SQL注入工具一览

    摘要:众所周知,SQL注入攻击是最为常见的Web应用程序攻击技术.同时SQL注入攻击所带来的安全破坏也是不可弥补的.以下罗列的10款SQL工具可帮助管理员及时检测存在的漏洞. BSQL Hacker ...

  2. JS宝典

    hammerjs 终止事件流 window.event.returnValue = false; return false; 页面显示调用方法.类似viewWillApper IOS和android表 ...

  3. Squid服务日志分析

    Squid服务日志分析 Apache 和 Squid 是两种著名的代理缓存软件,但Squid 较 Apache 而言是专门的代理缓存服务器软件,其代理缓存的功能强大,支持 HTTP/1.1 协议,其缓 ...

  4. 为什么C++中空类和空结构体大小为1?(转载)

    原文链接:http://www.spongeliu.com/260.html 对于结构体和空类大小是1这个问题,首先这是一个C++问题,在C语言下空结构体大小为0(当然这是编译器相关的).这里的空类和 ...

  5. js获取浏览器语言(ie、ff、chrome)、contextpath

    /js获取浏览器语言(ie.ff.chrome) var language_en_us = "en-us"; var language_zh_cn = "zh-cn&qu ...

  6. 常用freemarker使用文档

    设置价格格式 <#setting number_format = "currency" /> <#assign price = 42 /> ${price} ...

  7. Python自动化 【第八篇】:Python基础-Socket编程进阶

    本节内容: Socket语法及相关 SocketServer实现多并发 1. Socket语法及相关 sk = socket.socket(socket.AF_INET,socket.SOCK_STR ...

  8. empty isset array_key_exists 的区别

    empty: 参数为0或为NULL时(如上面列子),empty均返回TRUE,详细情况可以参见empty官方手册 isset: 参数为NULL时,返回FALSE,0与NULL在PHP中是有区别的,is ...

  9. Ubuntu 利用 xinetd 限制 SSH 连接数

    安装 xinted sudo apt-get install xinetd 修改配置文件 sudo vim /etc/xinetd.conf 在配置文件中加入下列配置 defaults { insta ...

  10. proc文件系统在内核中的表现

    当Linux内核启动起来之后,我们可以通过proc虚拟文件系统来查看内的中的一些动态信息. 例如:可以 cat  /proc/misc  来查看系统中装载的所有misc类设备 cat  /proc/d ...