深入浅出DLL(基础篇)

来源:互联网 发布:数据审核制度 编辑:程序博客网 时间:2024/04/29 23:43

DLL(Dynamic Link Library),是动态链接库的简称,是一个不可执行的二进制文件,根据相应规则可执行文件可以使用dll的导出资源(dll里的函数等),要深入理解dll和用好dll必须理解dll里的资源(函数和变量)是如何被可执行文件使用的?搞清这一点,只需从三方面入手,一是dll资源如何导出;二是dll资源如何导入;三是dll如何加载。

1.dll资源如何导出

        如果把可执行文件比作是汽车,DLL比作是汽车的轮胎,汽车要与轮胎完美契合,这取决于汽车与轮胎之间的接口是否一致,dll导出资源就相当于给轮胎定义接口,只不过dll定义的接口是dll的资源,那么怎么才能导出dll资源呢,这里以windows为例,只需在要导出的函数和变量的声明前加上__declspec(dllexport)就ok了,这样编译器在编译的时候就知道该接口是要导出的会加一个标记,以方便链接器在链接的时候就生成dll资源导出表,这个导出表建立了资源符号(函数和变量的名称)和资源地址的对应关系。

2.dll资源如何导入

        同理汽车也要有一个与轮胎对应的接口,这里可执行文件也要定义接口,方法是在使用到的接口声明前加上__declspec(dllimport)就ok了,这样编译器在编译的时候就知道该接口是导入接口(来自dll),同样也会加一个标记,这样链接器在遇到加了标记的接口,就会从dll去找实现,若不能从dll的导出表中找到对应的接口,就会报链接错误(如外部符号未定义),若找到,则会生成一个导入表,该表包括dll模块的名称以及该模块的接口符号,补充说明下,有些链接器(如VC++ 6.0使用的链接器)不会从dll中找接口的实现,而是从.lib文件中找,该文件是在dll文件生成时生成的,里面只存放的是资源的导出符号,而没有实现,但这已经足够了,在这里链接器关心的是导出符号表,从导出符号表能找到对应的接口,就认为有了dll实现,这从另一个侧面反应了dll的动态性,只要导出符号(接口)相同,实现可以任意定制。

3.Dll如何加载

前面1、2步只是给汽车装上了轮胎,到这里只是他们之间的接口对应上了,轮胎是不是残次品,还得看它的质量,也即dll的实现。