转自:http://blog.csdn.net/testcs_dn/article/details/27237509

本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链接库为“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. #pragma once;
  3. //该宏完成在dll项目内部使用__declspec(dllexport)导出
  4. //在dll项目外部使用时,用__declspec(dllimport)导入
  5. //宏DLL_IMPLEMENT在SimpleDLL.cpp中定义
  6. #ifdef DLL_IMPLEMENT
  7. #define DLL_API __declspec(dllexport)
  8. #else
  9. #define DLL_API __declspec(dllimport)
  10. #endif
  11. DLL_API int add(int x, int y); //简单方法
  12. DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);
  13. DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);

源文件simpleDLL.cpp:

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

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


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


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


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


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

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

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

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

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

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

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

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

  1. Java(使用JNA)调用DLL库与C#调用DLL库的对比

    前言:在项目中经常使用DLL库对硬件进行操作,在发卡过程中使用频率尤为多,今天就Java与C#中调用DLL库的使用区别做一个介绍,本文着重具体的代码编写,具体过程看以下代码. 前提条件: 笔者已经封装 ...

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

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

  3. LabVIEW如何方便地调用DLL文件

    转自:http://bbs.elecfans.com/jishu_469502_1_1.html   LabVIEW调用DLL文件 LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用.比 ...

  4. C++ exe调用dll文件

    生成dll程序 extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,in ...

  5. C++ 生成 dll 和调用 dll 的方法实例(转)

    1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#e ...

  6. 获取DLL的文件路径以及调用DLL的文件路径

    如何在DLL中,获取DLL本身的路径以及调用DLL的文件的路径呢?主要通过GetModuleFileName(HMODULEhModule,LPTSTR lpFilename,DWORD nSize) ...

  7. C++ Builder创建和调用dll中的资源

    程序开发中经常会用到一些图标.图片.光标.声音等,我们称它们为资源(Resource).当多个窗口用到同样的资源时,可以将这些公共的资源放到一个dll文件里调用,这样,由于定位资源比在磁盘中定位文件花 ...

  8. 摘: VS2010 C++ 调用 DLL (C++编写)

    一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用. 比较常见的例子是各种应用程序框架,如ATL. ...

  9. C++编写 动态链接库dll 和 调用dll

    参考:https://jingyan.baidu.com/article/ff42efa92c49cfc19e2202fd.html 和htps://jingyan.baidu.com/article ...

随机推荐

  1. Developing a plugin framework in ASP.NET MVC with medium trust

    http://shazwazza.com/post/Developing-a-plugin-framework-in-ASPNET-with-medium-trust.aspx January 7, ...

  2. Visual Studio Online Integrations-Sync and migration

      原文:http://www.visualstudio.com/zh-cn/explore/vso-integrations-directory-vs

  3. 用开源Look&Feel (Substance)写 漂亮的Swing应用程序

    今天用Swing 做了一个模仿QQ2009的登录界面,用到了开源的Look&Feel (Substance),在使用的过程中遇到了一些问题,也学到了一些技巧.Substance (https: ...

  4. iOS ASIHTTPRequest用https协议加密请求

    iOS 终端请求服务端数据时,为了保证数据安全,我们一般会使用https协议加密,而对于iOS的网络编程,我们一般会使用开源框架:ASIHTTPRequest,但是如果使用传统的http方式,即使忽略 ...

  5. Linux中表示“时间”的结构体和相关函数

    转载于:http://blog.chinaunix.net/uid-25909722-id-2827364.html      Linux中表示“时间”的结构体和相关函数 2011-09-13 17: ...

  6. chown命令

    改变一个文件的所有者和组 1.命令格式: chown [选项]... [所有者][:[组]] 文件... 例子: komiles@iUbuntu:~/study/wordpress$ lltotal ...

  7. jQuery1.11源码分析(9)-----初始化jQuery对象的函数和关联节点获取函数

    这篇也没什么好说的,初始化jQuery对象的函数要处理多种情况,已经被寒冬吐槽烂了.关联节点获取函数主要基于两个工具函数dir和sibling,前者基于指定的方向遍历,后者则遍历兄弟节点(真的不能合并 ...

  8. web前端跨域方案

    ajax跨域请求   qzfl实现 跨子域的xhr 原生xhr不支持跨域,通过iframe+proxy.html达到跨子域 假如A页面要请求B页面,A.B跨子域.A创建指向B的proxy页的ifram ...

  9. PHP数据访问

    <?php //作业:把INFO表查出来用表格显示 //1.造一个连接对象 $db = new MySQLi("localhost","root",&qu ...

  10. Maven 安装以及一些开发技巧

    解压 apache-maven-3.2.5 在conf ->sites中配置repository 的路径. Eclipse 配置 maven 2. 3. 一些小BUG 或开发技巧 eclipse ...