动态链接库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. php win/linux/mac 安装redis扩展或者扩展报错 zend_smart_str.h file not found

    1 windows 安装reids 扩展 根据phpinfo 查看php信息.在pecl.php.net 下载对应的redis扩展版本,放如扩展目录,在php.ini 配置扩展信息,重启服务 2 li ...

  2. 线段树QWQ

    一直没碰过线段树,个人认为好长好难,不过这几天做题遇到了裸的线段树的题,TAT. 线段树我理解就是把二叉树的左右节点现在分别看成是两个区间. 那么现在这两个区间的端点怎么存放?怎么能够把这个区间里的数 ...

  3. gdb常用的调试命令

    首先将源代码编译.链接生成debug版本的可执行文件,然后通过‘gdb  debug版本的可执行文件名’进入调试模式. a) 单进程.单线程基础调试命令 l    显示main函数所在的文件的源代码 ...

  4. ScvQ常用的网站(持续更新...)

    GitHub:https://github.com/ScvQ 幕课网:https://www.imooc.com/u/4659537/courses 免费的SS:https://global.isha ...

  5. 通过蓝牙共享网络设置Charles抓包

    在办公室连接WiFi时,电脑和移动设备分配到的IP地址不在同一网段, 但是Android系统提供了一个非常方便的功能,可以搭建一个网络使得这两台设备处于同一网段,实现无障碍访问,使用Charles抓包 ...

  6. 我的新书,ArcGIS从0到1,京东接受预定,有160个视频,851分钟

     我的新书,ArcGIS从0到1,京东接受预定,8月08日至08月16日发货https://item.jd.com/53669213250.html当当网 http://product.dangdan ...

  7. MySQL中的sys系统数据库是干嘛的

    mysql5.7增加了sys 系统数据库,通过这个库可以快速的了解系统的元数据信息 这个库确实可以方便DBA发现数据库的很多信息,解决性能瓶颈都提供了巨大帮助   这个库在mysql5.7中是默认存在 ...

  8. Mapper抽象类参数

    Mapper< Object, Text, Text, IntWritable> Mapper< Text, Text, Text, Text> Mapper< Text ...

  9. sysbench 压测

    IP架构 sysbench部署服务器:172.17.100.107 压测服务器:172.17.100.100 MySQL部署目录:/usr/local/mysql 前置工作 1.完成MySQL的安装( ...

  10. oracle增删改查基本语法(DDL/DML)整理

    DDL:Data Definition Language(数据库定义语言)DML:Data Manipulation Language(数据库操作语言) 一.表结构操作(create table.al ...