C++编写DLL文件
动态链接库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文件的更多相关文章
- VC2010编写Dll文件(转)
源:VC2010编写Dll文件 1. 打开VS2010[Flie / New / Project / Visual C++ / Win32 / Win32 Console Application]在下 ...
- Win7 VS2015 x64 MASM汇编语言编写DLL文件
有点坑记录一下. 首先创建工程时选控制台类型工程,Win32估计就应该选Win32的,反正我测试用的控制台. 然后选DLL类型,除了Empty其他全都去掉. 工程属性,masm勾上. Linker & ...
- C++ 编写DLL文件给易语言调用
摸索了两天了,终于解决了所有问题,在此跟大家分享. 需要三个文件,dll_demo.h.dll_demo.cpp.dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEM ...
- C#直接使用DllImport调用C/C++动态库(dll文件)
1.C/C++动态库的编写 下面是我编写的一个比较简单的C++dll文件用来测试,关于如何编写dll文件,我这里便不再赘述,不懂得自行查询, (1).h文件 #ifdef MYDLL_EXPORTS ...
- Windows中DLL文件的意义及其作用
Windows中DLL文件的意义及其作用 DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和 ...
- delphi 基础之三 编写和调用dll文件
delphi 编写和调用dll文件 Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几 ...
- .dll 文件编写和使用
1.基本概念 dll(dynamic-link library),动态链接库,是微软实现共享函数库的一种方式.动态链接,就是把一些常用的函数代码制作成dll文件,当某个程序调用到dll中的某个函数的时 ...
- Delphi 编写DLL动态链接库文件的知识
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
- Delphi 编写DLL动态链接库文件的知识和样例(有详细步骤,很清楚)
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
随机推荐
- Linux之创建多个子进程
/*** fork_test.c ***/ #include<stdio.h> #include<stdlib.h> #include<unistd.h> int ...
- c++ 生成容器元素生成随机数
// random_shuffle example #include <iostream> // cout #include <algorithm> // random_shu ...
- TCP_IP Sockets编程C语言实现第2版 源码下载
原书网址:http://cs.ecs.baylor.edu/~donahoo/practical/CSockets2/textcode.html 源码下载: 链接:https://pan.baidu. ...
- H5的pushState与replaceState的用法
一.简介 HTML5引入了 history.pushState()和 history.replaceState()方法,它们分别可以添加和修改历史记录条目.这些方法通常与window.onpopsta ...
- super关键字和调用父类构造方法
表示父类对象的默认引用 如果子类要调用父类被覆盖的实例方法,可用super作为调用者调用父类被覆盖的实例方法. 使用super调用父类方法 使用super调用父类的构造方法 调用构造方法 本类中调用另 ...
- RES协议和断网访问URL出现的错误页面
# 11 Id: 26a4.1470 Suspend: 1 Teb: 7ff9f000 Unfrozen # Memory ChildEBP RetAddr Args to Child 00 01ca ...
- python 进程池和任务量变化测试
今天闲,测试了下concurrent.futures 模块中的ThreadPoolExecutor,ProcessPoolExecutor. 对开不同的数量的进程池和任务量时,所耗时间. from c ...
- python中heapq对dict进行排序
问题: 想从以下形式的dict中取value最大的2个key-value的key dict_num_num = {0: 0.07374631268436578, 1: 0.16307692307692 ...
- 黑马vue---46、vue使用过渡类名实现动画
黑马vue---46.vue使用过渡类名实现动画 一.总结 一句话总结: vue动画的过渡类名的时间点中没有设置样式的话就是默认的样式 使用 transition 元素,把 需要被动画控制的元素,包裹 ...
- Android:动态库(.so)调试技巧
一.反汇编定位crash ①查看crash log: 上图已标出crash发生在 libdeflicker_gpu.so 库中的 default_fail_func() 函数,但是 libdeflic ...