一、API链接库
API即Application Programming Interface,是以一种新的方法代替了DOS中用软中断的方式。
WIN32API中包括了大量的函数、结构和消息等,它不仅为应用程序所调用,也是Windows自身的一部分,Windows自身的运行也调用这些API函数。
Win32的API函数放在Windows的动态链接库(DLL)中,DLL是一种Windows的可执行文件,采用的是和 .exe文件同样的PE格式,在PE格式文件头的导出表中,以字符串形式指出了这个DLL能提供的函数列表。应用程序使用字符串类型的函数名指定要调用的函数。
二、动态链接的概念
动态链接库中的代码在程序链接的时候并不会被插入到可执行文件中,在程序运行的时候才将整个库的代码调入内存,所以称为“动态链接”。
如果有多个程序用到同一个动态链接库,Windows在物理内存中只保留一份库的代码,仅通过分页机制将这份代码映射到不同进程的地址空间中,这样不管有多少程序在使用一个库,库代码实际占用的物理内存永远只有一份。
当然,这时候库使用的数据段还是会被映射到不同的物理内存中,多少个程序在使用动态链接库就会有多少份数据段。
三、API函数调用的过程
书中没有介绍函数的具体调用过程,但是综合书本前后的描述,可以大致得出调用的过程如下:
1. 在程序中声明函数。系统的函数声明以头文件的方式存储在.inc文件中,在编写程序时用include语句将.inc文件中囊括到代码中。在编译时编译器会将include XXX.inc的语句替换为.inc文件中的内容。
2. 找到被调用函数的位置。在程序调用已声明的函数时,程序必须知道调用的API函数存在于哪个DLL中,这些信息存储在可执行文件头的导入表中。导入表的信息是源代码在编译时,由链接器根据导入库中的函数名称,装入的动态链接库名称等信息写入可执行文件头的导入表,导入库就是.lib文件,一个DLL文件对应一个导入库,在编写可执行程序的代码时,为了告诉链接程序使用哪个导入库,使用的语句是:includelib 库文件名 或 includelib <库文件名>。
3. 根据动态链接库中的导出表信息校正被调用函数位置。当PE文件被执行的时候,Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入,再根据DLL文件中的函数导出信息对被执行文件的IAT表进行修正。
四、动态链接库的文件形式
动态链接库的缩写为DLL,大部分动态链接库是以扩展名为dll的文件形式存在的,但并不是只有dll扩展名的文件才是动态链接库,系统中的某些exe文件、字体文件(*.fon)、一些驱动程序(*.drv和*.sys)、各种控件(*.ocx)和输入法模块(*.ime)等都是动态链接库。
一个文件是否是动态链接库取决于它的文件结构,动态链接库文件和可执行文件同样使用标准的PE文件格式,仅文件头中的属性位不同而已,所以exe文件的一些特征也存在于动态链接库中,比如,在动态链接库中也可以定义并使用各种资源,可以导入并使用其他动态链接库中的函数等。
实际上,系统中大部分包含公用代码的模块——不管扩展名是什么——都有可能是动态链接库。
五、编写动态链接库文件
(一).入口点
与可执行文件一样,动态链接库需要一个入口点。Windows在库加载、卸载、进程中线程的创建和结束等时候调用入口函数,以便动态链接库可以采取相应的动作。
1. Windows会传给入口函数3个参数:
(1)dwReason参数的值表示本次调用的原因,它可能是下面的四种情况之一:
① 当dwReason的值是DLL_PROCESS_ATTACH的时候,表示动态链接库刚被映射到某个进程的地址空间,程序可以在这里进行一些初始化的工作,并返回TRUE表示初始化成功,返回FALSE表示初始化出错,这样库的装入就会失败。这给了动态链接库一个机会来阻止自己被装入。比如,库程序可以在这里申请并保留一些内存,如果申请失败的话就可以返回FALSE告诉Windows,库无法正常工作。
② 当dwReason的值是DLL_PROCESS_DETACH的时候则相反,表示动态链接库将被卸载,库程序可以在这里进行一些资源的释放工作,如将初始化时申请的内存释放,将打开的文件关闭等。以DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH值进行的调用在库的生命周期中只可能出现一次。
③ 当dwReason的值是DLL_THREAD_ATTACH的时候,表示应用程序创建了一个新的线程。当某个线程正常终止的时候,dwReason的值是DLL_PROCESS_DETACH。如果应用程序不是以多线程方式工作的话,就不会有这两种原因的调用;反之,如果应用程序频繁地创建和结束线程,那么入口函数将不断被调用。
(2)hInstDll是动态链接库的模块实例句柄。当使用这个句柄来装入资源的时候,表示资源是定义在库文件中的。对于动态链接库来说,获取这个句柄的唯一途径


1万+

被折叠的 条评论
为什么被折叠?



