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函数可 ...
随机推荐
- Java面向对象4(P~U)
P 3-1 Point类的构造函数 (SDUT 2670) import java.util.Arrays; import java.util.Scanner; public class Mai ...
- UVALive 4254 Processor ——(二分+优先队列处理)
题目是求最小化最大值,很显然是二分,但是二分以后怎么判断mid是否可行并不容易. 代码参考了网上一个博客的代码.巧妙之处在于一秒一秒的考虑,这样可以把处理速度mid直接转化成1秒内实际的量来解决(避免 ...
- HDU 2859 Phalanx ——(DP)
感觉是个n^3的dp,只是可能上界比较松吧..转移见代码.值得注意的一个地方是如果n是1,那么在for里面是不会更新答案的,因此ans要初始化为1. 代码如下: #include <stdio. ...
- ICEM—奇葩
原视频下载地址:https://yunpan.cn/cSsbI89zP9Z4K 访问密码 a287
- windows下安装mongodb数据库以及使用数据库
首先下载mongodb, 链接: https://pan.baidu.com/s/1KyvF7bAqGM8K-ir-hFNhPw 密码: vlc9 双击进行安装 勾选我接受并单击next 选择cust ...
- [Phoenix] Mix 命令
mix phx.gen.html 命令生成模板: # 其中 name 和 age 是 schema 字段名称,后面跟的是类型 # 下面这样的写法,会生成 controller 和 service 层的 ...
- 使用vagrant一键部署本地php开发环境(一)
一:我们为什么需要用这玩意 我们在开发中经常会面临的问题:环境不一致,有人用Mac有人用Windos还有几个用linux的,而我们的服务器都是linux. 在我本地是可以的啊,我测了都,没有问题 ...
- Flutter移动电商实战 --(29)列表页_商品列表数据模型建立
简历数据模型 json生成dart类的网站: https://javiercbk.github.io/json_to_dart/ json数据 {"code":"0&qu ...
- java获取远程图片分辨率
package com.haiyisoft.hyoaPc; import java.awt.image.BufferedImage;import java.io.IOException;import ...
- Vue于React特性对比(四)
新开了一个vue的项目,从vue单页面框架搭建到单点登录接入都是自己负责搞的.然后准备将这套东西迁移到react上.然后有了这篇文章. 1,reactjs分环境打包明显要比vue更为麻烦 vue修改的 ...