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

二、为什么使用DLL?

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

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

三、怎样使用DLL?

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

以下开发环境为visual studio中

  常规dll应该配备的3类文件:

  (1)dll文件:必备

  (2)lib文件:非必备。含有dll函数入口信息,用于隐式加载。

  (3)头文件.h:非必备。在头文件中写好声明(因此是隐式加载),一来方便给人看有哪些东西,二来方便别人用时不用再写一大堆声明。

  文件的摆放位置

  显示加载:只需要把dll放到与可执行文件同一目录下即可

  隐式加载:把dll和lib放到项目文件夹下。或者“右键项目属性---链接器---常规--附加库目录”中添加dll和lib所在文件夹

  extern “C” _declspec(dllimport)

  (1)_declspec是关键字,用于表示该函数、变量时导出、导入的,括号里dllexport意为其将要导出,dllimport意为其将要导入。

  (2)extern “C”用于指定编译器编译后的函数别名,这样使用时才能正确查找到。即对于变量extern int a;这样的直接写为extern “C” int a;即可,函数同理。

  (3)(.def)文件的语法:entryname[=internalname] [@ordinal [NONAME]] [[PRIVATE] | [DATA]]方括号内为可选项。

  (4)共享出去给别人的头文件通常有这样一段(宏变量名随意):

  这样效果:写dll的人先定义宏AAA,编译时函数method当导出,使用dll的人没有定义AAA,于是函数method为导入,方便写好头文件直接共享出去,不用多作修改。

  (5)在vs中,如果使用了非空项目,vs将自动生成如上面所说的“AAA”,并添加到预编译中。该设置保存在.vcxproj类型的文件中,位置在该文件的PreprocessorDefinitions标签中,并且有四个,分别对应debuf,release和x86、x64的组合。想要修改请可以直接去该文件修改相应宏的名字。

  (6)显示加载typedef int (*SUBPROC)(int a,int b);意思为定义一个类型SUBPROC,该类型对应dll的函数原形,但仍然需要强制转换。

  (7)使用时,声明仍然需要添加extern “C”在开头,声明外部函数时没有添加,将导致外部符号找不到连接(实际目的就是要使两个项目的函数别名对应起来。若其中一个交由编译器自主处理可能造成别名不一致)

  (8)如何获取dll中的类的实例?

    假定:把类class A 声写在头文件,实现写在Cpp。

    写一个函数A* getA(return new A();),然后如上述所述导出导入该函数去获取就是。

  (9)DllMain函数是什么?

  dll的函数入口,不写系统自动帮你写,但有可能出现bug。

APIENTRY:api入口。

HMODULE:实际上typedef HINSTANCE HMODULE,而现在32,64位系统上与HINSTANCE没有区别

DWORD:调用dll时系统传入的变量类型。看上面4个case的英文,用途是当进程(线程)加载(卸载)该dll时可以让该dll做一些额外的(初始化、回收指针等)操作。

联系:https://wenku.baidu.com/view/f5e0a06ca45177232f60a2d4.html

C++编写DLL文件的更多相关文章

  1. VC2010编写Dll文件(转)

    源:VC2010编写Dll文件 1. 打开VS2010[Flie / New / Project / Visual C++ / Win32 / Win32 Console Application]在下 ...

  2. Win7 VS2015 x64 MASM汇编语言编写DLL文件

    有点坑记录一下. 首先创建工程时选控制台类型工程,Win32估计就应该选Win32的,反正我测试用的控制台. 然后选DLL类型,除了Empty其他全都去掉. 工程属性,masm勾上. Linker & ...

  3. C++ 编写DLL文件给易语言调用

    摸索了两天了,终于解决了所有问题,在此跟大家分享. 需要三个文件,dll_demo.h.dll_demo.cpp.dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEM ...

  4. C#直接使用DllImport调用C/C++动态库(dll文件)

    1.C/C++动态库的编写 下面是我编写的一个比较简单的C++dll文件用来测试,关于如何编写dll文件,我这里便不再赘述,不懂得自行查询, (1).h文件 #ifdef MYDLL_EXPORTS ...

  5. Windows中DLL文件的意义及其作用

    Windows中DLL文件的意义及其作用 DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和 ...

  6. delphi 基础之三 编写和调用dll文件

    delphi 编写和调用dll文件   Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几 ...

  7. .dll 文件编写和使用

    1.基本概念 dll(dynamic-link library),动态链接库,是微软实现共享函数库的一种方式.动态链接,就是把一些常用的函数代码制作成dll文件,当某个程序调用到dll中的某个函数的时 ...

  8. Delphi 编写DLL动态链接库文件的知识

    一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...

  9. Delphi 编写DLL动态链接库文件的知识和样例(有详细步骤,很清楚)

    一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...

随机推荐

  1. CF1140F Extending Set of Points 【按时间分治,并查集】

    题目链接:洛谷 首先我们考虑没有撤回操作的情况,就是将每一行和每一列看做一个点(代表行的称为白点,代表列的称为黑点),每个点$(x,y)$看做一条边. Extend操作实际上就是$x_1$行与$y_1 ...

  2. Linux之信号

    产生信号五种方法: 按键产生:ctrl+c.ctrl+z.ctrl+\ 系统调用产生:如kill.raise.baort 软件条件产生:如定时器alarm 硬件异常产生:非法访问内存(段错误).除0( ...

  3. 利用Python爬取朋友圈数据,爬到你开始怀疑人生

    人生最难的事是自我认知,用Python爬取朋友圈数据,让我们重新审视自己,审视我们周围的圈子. 文:朱元禄(@数据分析-jacky) 哲学的两大问题:1.我是谁?2.我们从哪里来? 本文 jacky试 ...

  4. python线程+队列(queue)

    ---恢复内容开始--- python的线程学习 用处 pocpiliang脚本的编写 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程.语法如下: _thr ...

  5. shell中的for循环用法详解

    for i in “file1” “file2” “file3”for i in /boot/*for i in /etc/*.conffor i in $(seq -w 10) –>等宽的01 ...

  6. ThinkPHP使用smarty模板引擎的方法

    ThinkPHP支持多种php模板引擎,可以根据个人需要加以配置.下面我们以Smarty模板引擎为例,给大家说说具体的操作流程! 首先去Smarty官网上下载一个Smarty.本站下载地址:http: ...

  7. unittest-每个模块用例一条一条跑,模块都合在一个表格里面统计的方法

    文件目录 文件里面的结构就是常规的 unittest框架的写法 总执行文件 # #coding=utf-8 import unittest, time, os, multiprocessingimpo ...

  8. 关于adb命令获取安卓手机uuid时,demon 显示启动成功,但又获取不到uuid的解决办法:现象如下所示

    * daemon not running. starting it now on port 5037 * *demon started successfully* *list of devices a ...

  9. 使用STM32F103ZET霸道主板实现SD卡的读写(非文件系统)

    了解STM32F103ZET是高容量多管脚的芯片 了解SD读写线路图 了解SD的基地址 阅读STM32F10xx英文参考 SDIO那章,我们编写代码边看文档解析 建工程,打开包含所有包括外设库函数的样 ...

  10. shell之判断文件是否存在

    #!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" #这里的-x 参数 ...