***************************************************

更多精彩,欢迎进入:http://shop115376623.taobao.com

***************************************************

本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流。

本文包含以下内容:

1、创建动态链接库项目

2、向动态链接库添加类

3、创建引用动态链接库的应用程序

4、在控制台应用程序中使用类库的功能

5、更丰富的simpledll类和相关问题

参考资料

一、创建动态链接库项目:

1、打开Microsoft Visual Studio 2010,选择File->New->Project。

2、在New Project中选择Installed Templates->Visual C++->Win32。

3、选择Win32 Console Application,设置名称:simpledll,设置解决方案名:zdddll。

4、单击OK,在出现的Win32 Application Wizard的Overview对话框中点击Next。

5、在Application Settings中,选择Application type下的DLL。

6、勾选Additional options下的Empty project。

7、单击Finish创建项目。

二、向动态链接库添加类:

1、添加新类头文件。右键单击simpledll项目,Add->New Item,选择Header File(.h),设置名称为simpledll,单击Add。

2、添加新类源文件。右键单击simpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为simpledll,单击Add。

3、为新类添加内容。内容如下:

头文件simpledll.h:

[html] view plaincopy
  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. namespace zdd
  12. {
  13. //导出类
  14. class DLL_API SimpleDll
  15. {
  16. public:
  17. SimpleDll();
  18. ~SimpleDll();
  19. int add(int x, int y); //简单方法
  20. };
  21. }

源文件simpledll.cpp:

[cpp] view plaincopy
  1. //------------------ simpledll.cpp ----------------
  2. //注意此处的宏定义需要写在#include "simpledll.h"之前
  3. //以完成在dll项目内部使用__declspec(dllexport)导出
  4. //在dll项目外部使用时,用__declspec(dllimport)导入
  5. #define DLL_IMPLEMENT
  6. #include "simpledll.h"
  7. namespace zdd
  8. {
  9. SimpleDll::SimpleDll()
  10. {
  11. }
  12. SimpleDll::~SimpleDll()
  13. {
  14. }
  15. int SimpleDll::add(int x, int y)
  16. {
  17. return x+y;
  18. }
  19. }

4、完成后点击Build->Build Solution,生成解决方案。可在~zdddll\Debug下查看生成的simpledll.lib和simpledll.dll.文件。

三、创建引用动态链接库的应用程序:

1、选择File->New->Project。

2、在New Project中选择Installed Templates->Visual C++->Win32。

3、选择Win32 Console Application,设置名称:usesimpledll。选择Add to solution。

4、单击OK,在出现的Win32 Application Wizard的Overview对话框中点击Next。

5、在Application Settings中,选择Application type下的Console application。

6、取消Additional options下的Precompiled header,勾选Empty project。

7、单击Finish创建项目。

四、在控制台应用程序中使用类库的功能:

1、为控制台应用程序添加main.cpp。右键单击usesimpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为main,单击Add。

2、为main.cpp添加内容。如下所示:

[cpp] view plaincopy
  1. //------------------ main.cpp -------------------
  2. #include "simpledll.h"
  3. using namespace zdd;
  4. #include <iostream>
  5. using namespace std;
  6. int main(char argc, char**argv)
  7. {
  8. //
  9. cout << "----------------------" <<endl;
  10. SimpleDll sd;
  11. cout << "sd.add: 3+5=" << sd.add(3, 5)<<endl;
  12. cout << "sd.getConst(): "<<sd.getConst()<<endl;
  13. SimpleDll *psd = new SimpleDll;
  14. cout << "psd->add: 5+5=" << psd->add(5, 5)<<endl;
  15. cout << "psd->getConst(): "<<endl;
  16. cout << "----------------------" <<endl;
  17. cout << "please press Enter exit."<<endl;
  18. getchar();
  19. return 0;
  20. }

3、引用simpledll项目。右键单击usesimpledll项目,选择Properties->Common Properties->Framework and References。点击Add New Reference,选择simpledll项目,单击OK。

4、设置头文件路径。选择Properties->Configuration Properties->VC++ Directories。在Include Directories项添加$(SolutionDir)\simpledll\,选择应用,确定。

5、设置usesimpledll项目为活动项目。右键单击usesimpledll项目,选择Set up StartUp Project。

6、生成解决方案。Debug运行结果如下:

[cpp] view plaincopy
  1. 3+5=8
  2. 5+5=10

五、更丰富的simpledll类和相关问题:

simpledll.h文件:

[cpp] view plaincopy
  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. namespace zdd
  12. {
  13. //导出类
  14. class DLL_API SimpleDll
  15. {
  16. public:
  17. SimpleDll();
  18. ~SimpleDll();
  19. int add(int x, int y); //简单方法
  20. static int sub(int x, int y);//静态方法
  21. int getConst(); //
  22. int getNum();
  23. private:
  24. void setNum(int n);
  25. int num;
  26. };
  27. //全局变量
  28. int DLL_API number;
  29. SimpleDll DLL_API sdd;
  30. //对于指针,下面两种用法没区别?
  31. SimpleDll DLL_API *psdd;
  32. SimpleDll *psdd1;
  33. //方法
  34. int DLL_API Add(int a, int b);
  35. SimpleDll *createClass()
  36. {
  37. return new SimpleDll;
  38. }
  39. /*
  40. //问题1:若这样使用,则出现如下错误:
  41. // error C2059: syntax error : '__declspec(dllexport)'
  42. // error C2143: syntax error : missing ';' before '{'
  43. // error : '__declspec(dllimport)'
  44. // error C2143: syntax error : missing ';' before '{'
  45. // error C2447: '{' : missing function header (old-style formal list?)
  46. //为什么?
  47. SimpleDll* DLL_API createClass1()
  48. {
  49. return new SimpleDll;
  50. }
  51. */
  52. /*
  53. //问题2:若这样使用,则出现如下错误:
  54. //Error 1   error C2491: 'zdd::createClass1' : definition of dllimport function not allowed usesimpledll
  55. //为什么?
  56. SimpleDll DLL_API * createClass2()
  57. {
  58. return new SimpleDll;
  59. }
  60. */
  61. //问题3:这样使用(实现在.cpp中),编译没有问题。
  62. //但在main中应用时回出现以下错误:
  63. // error LNK2019: unresolved external symbol "class zdd::SimpleDll * __cdecl zdd::createClass3(void)" (?createClass3@zdd@@YAPAVSimpleDll@1@XZ) referenced in function _main
  64. //该如何解决?
  65. SimpleDll *createClass3(); //先别这样用
  66. //全局方法加DLL_API和不加DLL_API时的区别
  67. int DLL_API getConst1();
  68. //int getConst2(); //不要这样使用
  69. //也不要这样用
  70. //否则当程序发布之后,如果只想通过更新.dll
  71. //来达到更新程序数据的目的,比如将此处的100更新成10.
  72. //通过下面的方法你是做不到的
  73. int getConst2()
  74. {
  75. return 100;
  76. //      return 10;
  77. }
  78. //也不要这样用,否则将出现如下错误
  79. //error C2491: 'zdd::getConst3' : definition of dllimport function not allowed
  80. /*
  81. int DLL_API getConst3()
  82. {
  83. return 100;
  84. }
  85. */
  86. //不要这样用,同理
  87. int others(int a)
  88. {
  89. return a+10;
  90. }
  91. }

simpledll.cpp文件:

[cpp] view plaincopy
  1. //------------------ simpledll.cpp ----------------
  2. //注意此处的宏定义需要写在#include "simpledll.h"之前
  3. //以完成在dll项目内部使用__declspec(dllexport)导出
  4. //在dll项目外部使用时,用__declspec(dllimport)导入
  5. #define DLL_IMPLEMENT
  6. #include "simpledll.h"
  7. namespace zdd
  8. {
  9. SimpleDll::SimpleDll()
  10. {
  11. }
  12. SimpleDll::~SimpleDll()
  13. {
  14. }
  15. int SimpleDll::add(int x, int y)
  16. {
  17. return x+y;
  18. }
  19. int SimpleDll::sub(int x, int y)
  20. {
  21. return x-y;
  22. }
  23. int SimpleDll::getConst()
  24. {
  25. return 10; //
  26. }
  27. void SimpleDll::setNum(int n)
  28. {
  29. num = n;
  30. }
  31. int SimpleDll::getNum()
  32. {
  33. return num;
  34. }
  35. extern int number = 5;
  36. int Add(int a, int b)
  37. {
  38. return a+b;
  39. }
  40. SimpleDll *createClass3()
  41. {
  42. return new SimpleDll;
  43. }
  44. int getConst1()
  45. {
  46. return 100;
  47. //return 10;
  48. }
  49. /*
  50. //error
  51. extern int getConst2()
  52. {
  53. return 100;
  54. }
  55. */
  56. }

main.cpp文件:

[cpp] view plaincopy
  1. //------------------ main.cpp -------------------
  2. #include "simpledll.h"
  3. using namespace zdd;
  4. #include <iostream>
  5. using namespace std;
  6. int main(char argc, char**argv)
  7. {
  8. //
  9. cout << "----------------------" <<endl;
  10. SimpleDll sd;
  11. cout << "sd.add: 3+5=" << sd.add(3, 5)<<endl;
  12. cout << "sd.getConst(): "<<sd.getConst()<<endl;
  13. SimpleDll *psd = new SimpleDll;
  14. cout << "psd->add: 5+5=" << psd->add(5, 5)<<endl;
  15. cout << "psd->getConst(): "<<endl;
  16. cout << "----------------------" <<endl;
  17. cout << "SimpleDll::sub: 2-1=" << SimpleDll::sub(2,1)<<endl;
  18. cout << "----------------------" <<endl;
  19. cout << "zdd::number: "<<number<<endl;
  20. number = 10;
  21. cout << "changed zdd::number: "<<number<<endl;
  22. cout << "----------------------" <<endl;
  23. cout << "sdd.add: 6+8=" << sdd.add(6,8)<<endl;
  24. cout << "psdd->add: 6+8=" <<psdd->add(6,8)<<endl;
  25. cout << "psdd1->add: 6+8=" <<psdd1->add(6,8)<<endl;
  26. cout <<endl;
  27. cout << "sdd.getConst(): "<<sd.getConst()<<endl;
  28. cout << "psdd.getConst(): "<<psdd->getConst()<<endl;
  29. cout << "psdd1.getConst(): "<<psdd1->getConst()<<endl;
  30. cout << "----------------------" <<endl;
  31. cout << "zdd::Add: 7+8="<<Add(7,8)<<endl;
  32. cout << "----------------------" <<endl;
  33. SimpleDll *p = createClass();
  34. cout << "create->add: 2+3=" <<p->add(3,2)<<endl;
  35. cout << "create->getConst(): "<<p->getConst()<<endl;
  36. cout << "----------------------" <<endl;
  37. //  SimpleDll *p3 = createClass3();
  38. //  cout << "create3->add: 2+3=" <<p3->add(3,2)<<endl;
  39. //  cout << "create3->getConst(): "<<p3->getConst()<<endl;
  40. //  cout << "----------------------" <<endl;
  41. cout << "----------------------" <<endl;
  42. //请别在你的应用程序中使用getConst2
  43. cout << "DLL_API getConst1: "<<getConst1()<<endl;
  44. cout << "        getConst2: "<<getConst2()<<endl;
  45. //  cout << "DLL_API getConst3: "<<getConst3()<<endl;
  46. cout << "----------------------" <<endl;
  47. //  cout << "others: " << others(6)<<endl;
  48. //  cout << "others: " << others(16)<<endl;
  49. //  cout << "----------------------" <<endl;
  50. cout << "please press Enter exit."<<endl;
  51. getchar();
  52. return 0;
  53. }

运行结果为:

[html] view plaincopy
  1. ----------------------
  2. sd.add: 3+5=8
  3. sd.getConst(): 10
  4. psd->add: 5+5=10
  5. psd->getConst():
  6. ----------------------
  7. SimpleDll::sub: 2-1=1
  8. ----------------------
  9. zdd::number: 5
  10. changed zdd::number: 10
  11. ----------------------
  12. sdd.add: 6+8=14
  13. psdd->add: 6+8=14
  14. psdd1->add: 6+8=14
  15. sdd.getConst(): 10
  16. psdd.getConst(): 10
  17. psdd1.getConst(): 10
  18. ----------------------
  19. zdd::Add: 7+8=15
  20. ----------------------
  21. create->add: 2+3=5
  22. create->getConst(): 10
  23. ----------------------
  24. ----------------------
  25. DLL_API getConst1: 100
  26. getConst2: 100
  27. ----------------------
  28. please press Enter exit.

可将生成的可执行文件和应用程序拷出到同一目录下,通过更改方法getConst1,getConst2,体会dllexport和dllimport的作用。

代码中提出的几个问题方法,暂时无解,暂不使用。

vs2010创建和使用动态链接库(dll)相关推荐

  1. VC++6.0如何创建与调用动态链接库(dll)

    VC++支持的DLL: DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库.MFC规则DLL和MFC扩展DLL.DLL导出函数(或变量.类)可供应用程 ...

  2. c++ 编译添加dll_(windows平台下)深入详解C++创建动态链接库DLL以及如何使用它(一)...

    前言:C以及C++的动态链接库和静态链接库,说起来很简单,但是实际上在创建的过程中有很多的坑,本人也是一路踩了很多坑,查了很多资料,下决定写一篇完整的文章来详细解释使用VS创建C++动态链接库的完整流 ...

  3. VC++动态链接库(DLL)编程(四)――MFC扩展 DLL

    VC++动态链接库(DLL)编程(四) ――MFC扩展 DLL 作者:宋宝华  e-mail:21cnbao@21cn.com   前文我们对非MFC DLL和MFC规则DLL进行了介绍,现在开始详细 ...

  4. VC++动态链接库(DLL)编程(一)――理解库

    VC++动态链接库(DLL)编程(一) ――理解库 作者:宋宝华  e-mail:21cnbao@21cn.com 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概 ...

  5. 动态链接库dll,静态链接库lib, 导入库lib

    目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称"静态库"),另一种为动态连接库(DLL,以下简称"动态库")的导入库(Imp ...

  6. 动态链接库dll,静态链接库lib, 导入库lib 转

    动态链接库dll,静态链接库lib, 导入库lib 在用VS编译工程的时候,我们会选择动态链接库dll,静态链接库lib(static library),可是为什么在编译动态链接库的时候也可以指定输出 ...

  7. VC++动态链接库(DLL)编程深入浅出(zz)

    1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了" ...

  8. Clion生成动态链接库.dll

    今天研究如何生成动态链接库.dll文件纠结了好久.在保证代码文件不报错的情况下,可能要注意几个方面. 一·项目结构要完整. Clion项目生成后会和其他编程工具不同的地方在于会有一个CMakelist ...

  9. [转]C++学习:VC++动态链接库(DLL)编程深入浅出(zz)

    转自:http://www.cnblogs.com/chio/archive/2007/11/03/948480.html 1.概论 先来阐述一下DLL(Dynamic Linkable Librar ...

最新文章

  1. VC++ 保存数据为音频文件(WAV)学习
  2. SIFT特征及特征匹配:SIFT and feature matching
  3. android jdk环境的配置
  4. Android,XML解析
  5. 【Flink】 producer attempted to use a producer id which is not currently assigned to its transaction
  6. java面试准备---JSF系统学习知识点总结---随时更新
  7. android统一错误ui展示,Android UI异常分析
  8. 谁敢动英伟达的奶酪?AI芯片领域,这12家创业公司值得关注
  9. Android OpenGL ES 开发教程(24):Depth Buffer
  10. maven构建ssm工程
  11. 鸿蒙推送荣耀,华为鸿蒙首批推送机型8款,荣耀“避嫌”,不在首批名单
  12. python第三篇:python、flask关系映射
  13. NIO的基本概念和缓冲区
  14. 最小生成树 刘汝佳模板
  15. 在阿里 AI Lab 做 NLP 高级算法专家是一种什么样的体验?
  16. ansible问题记录--Timeout (12s) waiting for privilege escalation prompt
  17. APP分享多张图片和文字到微信朋友圈(android 7.0以上适配)
  18. input的几种禁用方法
  19. for 和 for...in 和 for...of
  20. 字节跳动秋招提前批(计算机视觉工程师)

热门文章

  1. Sql Server 开窗函数Over()的使用
  2. C++编译报错:重复定义
  3. git如何解决冲突(代码托管在coding)
  4. java web service简单示例
  5. 【设计模式】7、桥接模式
  6. PHP中开发的良好习惯总结(持续更新) By ACReaper
  7. JS应用DOM入门:DOM的对象属性
  8. 微软正在考虑将Windows默认浏览器改为Chromium
  9. 一道多线程通信实例分析
  10. jsp 中包含 一个路径为变量的文件