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下设置git代理访问.
有时候克隆仓库巨慢无比,需要设置代理. 一般情况下 proxychains 可以搞定的. 但是某些情况,如go 安装模块的时候是调用git的.这个时候proxchains就不行了. go 也可以通过设 ...
- Java三大特征--多态
1.定义 允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式. 2.存在条件 2.1存在继承关系 2.2子类重写了父类方法 2.3父类类型的变量指向子类对象的 ...
- jira默认是jira_user用户组的用户有登录jira的权限
场景描述: 今天给jira新建了几个用户组,看着英文的jira_user和jira_developer有点多余,所以就给删掉了.然后后面新建了开发人员和测试人员用户组,进行了人员分配和项目分配,可是突 ...
- 2019-2020 ICPC, NERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred)
这是一场三人组队赛来的,单人带电子模板不限时单挑试一下.按照难度排序. B - Balls of Buma 题意:玩祖玛,射入任意颜色的球一个,当某段长度变长了且长度变长后>=3则这段就会消除, ...
- MySQL基础之二:主从复制
# mysql主从复制逻辑: 1.从库执行start slave 开启主从复制. 2.从库请求连接到主库,并且指定binlog文件以及位置后发出请求. 3.主库收到从库请求后,将信息返回给从库,除了信 ...
- 图论——最小生成树:Prim算法及优化、Kruskal算法,及时间复杂度比较
最小生成树: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.简单来说就是有且仅有n个点n-1条边的连通图. 而最小生成树就是最小权 ...
- elasticsearch java client
1.集群名相同,且机器处于同一局域网同一网段,es会自动去发现其他的节点.2.集群不在同一局域网同一网段时,只需要在 elasticsearch.yml 中配置目标机器和端口即可discovery.z ...
- java 架构师思维导图
java 基础 . 理解IO.多线程.集合等基础框架.对JVM原理有一定了解. spring spring boot ibatis structs开源框架了解. 熟悉分布式系统设计和应用. 小 ...
- VS Code文本编辑快捷操作(2)
1. 光标移动 移动光标最常用的就是方向键,但是方向键每次只能把光标移动一个位置,可以说是一种相对低效的方式.下面介绍针对单词.行.代码块.整个文档等多种光标移动方式. 1.1 ...
- The problem is now the wait_for_fds() example function: it will call something like select(), poll() or the more modern epoll() and kqueue().
小结: 1.线程与惊群效应 Serializing accept(), AKA Thundering Herd, AKA the Zeeg Problem — uWSGI 2.0 documentat ...