一、DLL是什么?

动态链接库(Dynamic Link Library)DLL文件与EXE文件一样也是可执行文件,但是DLL也被称之为库,因为里面封装了各种类啊,函数啊之类的东西,就像是一个库一样,存储着很多东西,主要是用来调用的。调用方式主要分为两种:隐式(通过lib文件与头文件) 与 显式(只通过DLL文件)。

(这是一条弹幕:2019.5.10 很多人私信我 我肥来说下 ,调用方是需要使用三件套的就是.h\.lib\.dll。只使用dll和lib调用的话,我再写一篇好了 地址在这边(点我点我) )

二、为什么使用DLL?

微软方面一边开源了很多代码,比如MFC的,这些代码是直接暴露在程序员眼皮子底下的,和容易调用,当然也很容易与程序员的代码发生冲突,业内也称之为“白盒复用”,有一定的优势,但是也有弊端。在此基础上,我们再来聊DLL就比较好,DLL将要一系列的代码转化成二进制,直接供程序使用,称之为“黑盒复用”。

动态链接库DLL最大的好处就是节省内存,程序在没有运行到dll里的函数的时候,dll里的函数就没有运行,只有在运行到了dll,才通过dll的接口函数访问dll,这样比直接把函数代码写到主题函数,或静态链接库相比,运行的效率有了很大的提高.其次使用DLL文件编程,其更新也较为方便,不需要与程序链接。

三、怎么样使用DLL?

1.首先创建一个空的DLL文件,创建方法:新建——项目——Win32控制台程序——然后取个名字——确定——下一步——选择DLL——勾选空白项目。顺利新建了项目。

2.然后我们在头文件下创建一个头文件这里我们是DLL1.h,输入如下代码:

#ifdef CREATEDELL_API_DU
#else
#define CREATEDELL_API_DU _declspec(dllimport) //当编译时,头文件不参加编译,所以.cpp文件中先定义,后头文件被包含进来,因此外部使用时,为dllexport,而在内部编译时,则为dllimport
#endif                                         class CREATEDELL_API_DU animal              //需要被外界调用的类(父类)
{
public:virtual int outDate() = 0;                 //纯虚函数void getWide(int x);   void getHigh(int y);protected:int wide;int high;
};class CREATEDELL_API_DU cat:public animal      //需要被调用的类(子类cat)
{
public:int outDate();
};class  CREATEDELL_API_DU dog :public animal     //需要被调用的类(子类dog)
{
public:int outDate();
};int CREATEDELL_API_DU exportDate();             //需要被调用的函数(单独的一个函数,不属于任何一个类)

3.在源文件下创建源文件,这里名字为DLL1.cpp,并插入以下代码:


#define CREATEDELL_API_DU _declspec(dllexport)#include <iostream>
#include "DLL1.h"
using namespace std;
//父类中函数实现
void animal::getWide(int x) {wide = x;
}
void CREATEDELL_API_DU animal::getHigh(int y){high = y;
}//子类cat中数据输出实现
int CREATEDELL_API_DU cat::outDate(){return (wide + high);wide += wide;high += high;
}//子类dog数据输出实现
int CREATEDELL_API_DU dog::outDate(){return (wide - high);
}//函数的实现
int CREATEDELL_API_DU exportDate(){return 666;
}

4.点击生成即可,DLL虽然是可执行文件但是是无法调试的,当你点调试的时候,会提示如下:

5.当生成完之后,我们便可以在项目文件夹下的Debug文件夹中看到DLL1.dll与DLL1.lib,并且在项目文件夹下的DLL1中看到DLL1.cpp。(忽略图表中的绿锁标志)

                 

那么到这里,我们的DLL算是全部搞定了

接下来需要重新新建一个Win32的控制台程序,打开工程,首先引入三个文件,也就是上面看到的.lib   .h  .dll三个。

工程——属性——配置属性——VC++目录。

包含目录:添加.h所在的文件夹

库目录:添加。lib所在的文件夹

添加后如下:

最后在链接器——输入——附加依赖项中添加DLL1.lib,并且确定。

最后将DLL文件放到新的工程项目的DEBUG目录下

到此添加库成功,现在我们去用代码实现:

在源文件中新建一个新的源文件,这里为test.cpp,并添加如下代码:

#include<iostream>
#include"test.h"
#include"DLL1.h"
using namespace std;
bool main()
{cout << exportDate()<<endl;          //调用函数输出666   dog dog;     //实例化dog对象、赋值、并输出。dog.getHigh(5);dog.getWide(6);cout << dog.outDate() << endl;cat cat;    //实例化cat对象、赋值、并输出cat.getHigh(16);cat.getWide(4);cout << cat.outDate()<< endl;getchar();          //让程序处于等待输入状态下,而不是一闪而过return 0;
}

最后编译——运行,得到以下结果:

补充:

可在dLL所在目录使用dumpbin -exports xxx.dll命令行来查看某dll中的函数.

可在EXE所在的目录下使用dumpbin -imports xxx.EXE来查看某EXE文件使用过哪些dll库.

64位EXE尽量去调用64位DLL,同理32位尽量调用32位。

显示调用可以参考这篇文章:C++编写一个简单的DLL

c++中DLL文件的编写与实现——三步走相关推荐

  1. c++中DLL文件的编写与实现——三步走(2)

    我干嘛写这个 (本方法调用方需要.lib  .dll) (问的人多了) C++在调用Dll中的函数的时候,如果是企业内部的话,肯定是希望三件套的方式(.h\.lib\.dll).这样做的话,编写方可以 ...

  2. 【C++】DLL文件的编写与实现——三步走

    一.DLL是什么? 动态链接库(Dynamic Link Library)DLL文件与EXE文件一样也是可执行文件,但是DLL也被称之为库,因为里面封装了各种类啊,函数啊之类的东西,就像是一个库一样, ...

  3. java web配置dll文件_JavaWeb项目中dll文件动态加载方法解析(详细步骤)

    相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO ...

  4. 电脑程序在计算机丢失怎么办,电脑中dll文件丢失怎么恢复?计算机中丢失dll文件修复方法...

    DLL文件是Windows系统中的动态链接文件,我们在运行程序时都必须链接到dll文件,如果缺少了则无法正常运行,相信大家都会遇到dll文件缺失的情况,那么电脑中dll文件丢失怎么恢复?下面电脑知识大 ...

  5. ROS中launch文件的编写

    ROS中launch文件的编写 launch文件介绍 ROS系统里的组成单位是节点(node),在启动ROS时需要启动所有的node,如果手动一一启动会是一项十分繁琐的事情,因此ROS通过launch ...

  6. 电力系统励磁涌流有关的问题分析。 可以通过MATLAB中m文件便编写产生励磁涌流

    电力系统励磁涌流有关的问题分析. 可以通过MATLAB中m文件便编写产生励磁涌流,也可以通过simulink仿真出励磁涌流. 可以仿真分析影响励磁涌流的因素,以及抑制励磁涌流的措施. 可以研究识别励磁 ...

  7. android修改dll文件,Android中dll文件的修改

    Android中dll文件的修改,最近下载了一款非常不错的益智类游戏,一打开,顶部还有广告,最讨厌游戏中还带广告的,点又点不掉,又怕误点,真的看了都烦...作为程序员,就有种想要把它干掉的想法,作为玩 ...

  8. MATLAB中MEX文件的编写与调试

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

  9. 深入浅出Powershell——拷贝GAC中dll文件

    场景:我们在客户的VM环境中进行SharePoint的开发工作,由于权限的限制(连IE的设置都无法修改),我们在很多情况除了以Administrator的身份执行应用程序(IE,VS2010,cmd窗 ...

  10. bids格式数据中config文件的编写

    config文件的编写 参考资料: 官网 github的template Getting started with BIDS, fMRIPrep, MRIQC_Saren Seeley PDF文档 1 ...

最新文章

  1. html脚本详解,HTML脚本教程详解
  2. 循环矩阵傅里叶对角化
  3. java---编写一个方法,返回一个int型的二维数组,数组中的元素通过解析字符串参数获得。
  4. 通过文件IO控制硬件设备的方法
  5. 【JFreeChart】JFreeChart—输出时序图
  6. 增加标 和增加其内容
  7. DOS Network一月项目月报
  8. 女大学生两块钱成功进外企
  9. gif 格式 完整 检查_GIF的完整格式是什么?
  10. Rwordseg和tmcn安装-2017.09.23
  11. linux查看进程加载的jar包,[Linux] 查看jar包内容
  12. 自己编写vb进度条控件
  13. PlaySound函数用法
  14. 华为的服务器固态硬盘LE系列和VE系列,02311TJY 800GB SSD FusionServer RH5885 V3华为服务器硬盘...
  15. 设备性能测试 : 内存带宽的测试
  16. Python 练习实例21 猴子吃桃问题
  17. matlab按图像边缘抠图_PS抠图教程_PS抠图方法大全
  18. Java - Timestamp cannot be cast to String
  19. snapchat为什么_我的Snapchat朋友旁边的表情符号是什么意思?
  20. 离散傅里叶变换----解释的最透彻的|包括定义物理意义

热门文章

  1. 还在为JS闭包烦恼? FF带你一篇文章玩转闭包,某化腾听了都说好!!
  2. 南通大学java期末_【Java爬虫】爬取南通大学教务处成绩
  3. 【C语言开源库】C语言必备实用第三方库Melon(包括数据结构算法)
  4. c语言编写生日祝福语大全,生日卡片祝福语(精选50句)
  5. 完美卸载itunes
  6. 易宝支付java待遇_Java学员张**入职易宝支付月薪12000元
  7. 国际贸易术语解释通则(DDU 未完税交货(……指定目的港))
  8. Fantom (FTM) 价格将在未来几天飙升 20%
  9. 我在名牌大学毕业后的经历 (看完感动,涌动,后泪流)转
  10. 近期几篇有关All-Pay论文总结(博弈论+机制设计)