01 动态链接库基础

DLL是一个包含函数和数据的模块, 它们可以被其他模块(应用程序或DLL)使用。

DLL可以定义两种函数: <1>导出函数   <2>内部函数 .

导出函数可以被内部或其他模块调用。

内部函数只能在DLL内部被调用。

  1. About Dynamic-Link Libraries

动态连接 允许一个模块在加载或运行时,仅仅只需包含定位一个动态库导出函数的信息,而无需将这个动态库整个编译进模块中。

调用一个DLL中的函数,有两种方法:

<1> load-time dynamic linking.(加载时动态链接), 是指显示地调用动态库中导出函数,就像这些函数在本地一样。  这需要你将模块与DLL对应的导入库文件进行链接。

<2> run-time dynamic linking(运行时动态链接), 在运行时使用LoadLibrary或者LoadLibraryEx函数来加载动态库。 当模块被加载后,使用GetProcAddress函数来获取动态库中导出的函数的地址。

DLL和内存管理:

每个进程将DLL加载到它的虚拟地址空间, 当DLL被加载到进程的虚拟地址空间后,他就可以调用DLL的导出函数了。

系统为每个引用的DLL维护一个引用计数,当一个线程加载DLL,引用计数会加1,当进程结束,引用计数减1,,  当引用计数为0时,DLL会被从虚拟地址空间中卸载。

与其他函数一样,一个导出的DLL函数运行在调用它的线程的上下文中,所以:

<1>进程中调用DLL的线程可以使用 被DLL函数打开的句柄,相似地,由线程打开的句柄也可以被DLL函数使用。

<2>DLL使用调用它的线程的栈, 使用调用它的进程的虚拟地址空间。

<3>DLL从调用它的进程的虚拟地址空间中分配内存。

动态链接库的优点:(相对于静态链接库)

<1>节省内存。 当多个进程加载相同的DLL时,DLL只会在物理内存中加载一份DLL, 每个进程加载DLL在物理内存中同一个基地址。

<2>当DLL的函数的实现改变,而函数声明没变的情况下,从新生成DLL。应用程序不需要重新编译和链接。

<3>不同编程语言写的程序可以调用相同的DLL函数,只要遵循调用约定。

调用约定(C , Pascal , 或者标准调用) 控制调用函数参数的压栈顺序,是否调用函数,还是被调用函数负责清理栈,是否任何参数被传递到寄存器中等。

 

使用动态库的潜在的缺点是: 引用程序不是自包含的: DLL依赖于DLL的存在。

当使用load-time dynamic linking, 如果应用程序需要的DLL不存在,那么系统将结束这个进程。

当使用run-time dynamic linking, 如果需要的DLL不存在,系统不会结束该进程,但是DLL导出还是不可用。

创建动态链接库

线程安全: 如果你的DLL被多线程应用程序使用,那必须对所有DLL数据进行同步,以避免数据污染。

如果要使用load-time dynamic linking, 必须创建一个导入库(.lib文件).

导出函数的两个方法:

<1>使用 __declspec 修饰符

<2>使用.def文件

创建导入库: .lib文件。   如何创建导入库?

动态链接库的入口点函数

动态库可以可选地指定一个入口点函数。 如果指定了,当一个进程或线程加载或卸载动态库时,系统都会执行入口点函数。 它可以被用来执行一些初始化和清理任务。

DllMain是一个占位符,当创建自己的DLL时,必须指定实际的入口点函数名字。

入口函数定义:DLL入口点函数必须以标准调用约定(standard-call calling convention)定义


DLL的导入库(即与dll文件相对应的.lib文件),提供系统加载动态库所需要的信息;并且提供定位动态库中的导出函数信息。

01 动态链接库基础

时间: 2024-10-11 14:56:28

01 动态链接库基础的相关文章

01背包基础 (杭电2602)

01背包问题: 有一个体积为V的背包,有n件物品,每件物品的体积,价值分别为w[i],p[i];要从n件物品中选些放入背包中,使背包里物品的总价值最大. 动态方程:c[i][j]=max(c[i-1][j],c[i-1][j-w[i]]+p[i]). 有关动态方程方面的代码: for (int i = 1; i <= n; i++) { for (int j = 1; j <= total_weight; j++) { if (w[i] > j) { c[i][j] = c[i-1][j

Jam&#39;s balance HDU - 5616 (01背包基础题)

Jim has a balance and N weights. (1≤N≤20) The balance can only tell whether things on different side are the same weight. Weights can be put on left side or right side arbitrarily. Please tell whether the balance can measure an object of weight M. In

后端 - Lession 01 PHP 基础

目录 Lession 01 php 基础 1. php 基础 2. php 变量 3. php 单引号 和 双引号区别 4. 数据类型 5. 数据类型转换 6. 常量 7. 运算符 8. 为 false 的几种情况(条件判断) 9. 流程判断 10. 循环 11.1 函数 11.2 函数的 行参 和 返回值 12. 常用函数 Lession 01 php 基础 1. php 基础 phpinfo():输出版本号 echo:输出文本 php.ini:php的配置文件 2. php 变量 命名变量必

shell编程01—shell基础

01.学习shell编程需要的知识储备 1.vi.vim编辑器的命令,vimrc设置 2.命令基础,100多个命令 3.基础.高端的网络服务,nfs,rsync,inotify,lanmp,sersync,sshkey批量分发管理 02.shell脚本概念 1.什么是shell shell是一个命令解释器,在操作系统的最外层,负责直接与用户对话,将用户的输入解释给操作系统,并输出操作系统各种各样的处理结果,输出到屏幕返回给用户.这种对话方式可与是交互式的(键盘输入命令,可以立即得到shell的回

&lt;&lt;Python基础教程&gt;&gt;学习笔记之|第01章|基础知识

本学习笔记主要用要记录下学习<<Python基础教程>>过程中的一些Key Point,或自己没怎么搞明白的内容,可能有点杂乱,但比较实用,查找起来也方便. 第01章:基础知识 ------ Jython:      Python的Java实现,运行在JVM中,相对稳定,但落后于Python,当前版本2.5,在TA(Python+Robot)会用到 IronPython:  Python的C#实现,运行在Common Language Runtime,速度比Python要快 >

01 mysql基础一 (进阶)

mysql基础一 1.认识mysql与创建用户 01 Mysql简介 Mysql是最流行的关系型数据库管理系统之一,由瑞典MySQLAB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性. (开源,免费) #关系型数据库:采用关系模型来组织数据的数据库 #关系:一张二维表,每个关系都有一个关系名,就是表名,互相关联 #模型:行和列(二维),具体指字段跟字段信息 02 进入my

Python入门学习 DAY 01 计算机基础

Python入门 DAY 01 作为一名刚刚学习python的小白,我首先去学习的并不是python语言的基础知识,而是先对计算机的基础进行了一个初步的了解,以下内容便是在学习python之前我去学习到的大致内容. 1.什么是编程语言    语言是一个事物与另外一个事物沟通的介质    编程语言是程序员与计算机沟通的介质    2.什么是编程    编程就是程序按照某种编程语言的语法规范将自己想要让计算机做的事情表达出来    表达的结果就是程序,程序就是一系列的文件    3.为什么要编程  

01前端基础入门

01 基本网格界面显示 1 <!-- 2 作者:offline 3 时间:2018-09-04 4 描述:html基本表格界面设计 5 在最基本的界面设计中,先套用表格界面,再在表格的基础上向里面添加图片和文字 6 因此在设计之初就需要设计好整个模块的表格嵌套结构 7 行之间的合并:colspan 8 列之间的合并:rowplan 9 被合并的单元格必须要从代码中删除 10 因此在布局中有一般是先细分表格多做单元格,然后进行单元格的合并 11 --> 12 13 <!DOCTYPE ht

01.Java基础问题

目录介绍 1.0.0.1 请手写equal方法,讲讲具体的原理?1.0.0.2 请说下String与StringBuffer区别,StringBuffer底部如何实现?String类可以被继承吗,为什么?1.0.0.3 String a=""和String a=new String("")的的关系和异同?String的创建机制?1.0.0.4 static关键字可以修饰什么?static使用的注意事项有哪些?static关键字的特点?1.0.0.5 为什么 Java