|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 ~风介~ 于 2018-10-14 22:41 编辑
1.1.3 动态链接
Windows工作原理的中心思想就是“动态链接”概念。Windows自身带有一大套函数,应用程序就是通过调用这些函数来实现它的用户界面和在屏幕上显示文本与图形的。这些函数都是在动态链接库里实现的。这些文件的名称都带有后缀.DLL,或有时带有后缀.EXE。在Windows 98中,这些文件通常放在\WINDOWS\SYSTEM子目录下,而在Windows NT中,则放在\WINNT\SYSTEM和\WINNT\SYSTEM32子目录下。
早期Windows的大部分只是实现了3个动态链接库。它们分别代表了Windows的3个主要的子系统,即内核(kernel)、用户(user)以及GDI。虽然新版Windows中子系统增加了不少,但是通常Windows程序调用的大部分函数实际上仍然以这3个模块为主。内核(在16位的KRNL386.exe及32位的KERNEL32.DLL中实现)负责操作系统的那些传统工作,包括内存管理、文件输入/输出及任务管理等。用户(在16位的User.exe及32位的User32.DLL中实现)指的是用户界面,负责所有的窗口管理。GDI(在16位的GDI.exe及32位的GDI32.DLL中实现)就是图形设备接口,负责在屏幕或打印机上显示文本与图形。
Windows 98带有上千个函数以供应用程序调用。每个函数都有一个意义明确的名字,比如CreateWindow。不用猜,这个函数是帮程序建立窗口用的。应用程序可能调用的所有函数必须先要在头文件里声明。
在Windows程序中,调用Windows函数与调用C语言的库函数(如Strlen),没什么两样。最主要的区别就是C语言里库函数的机器代码会直接链接到你的程序代码中,而Windows函数则是放在你的程序之外的DLL里。
当Windows程序运行时,它通过一个叫做“动态链接”(dynamic linking)的进程与Windows接口。每个Windows的EXE文件包含它所要用的各个动态链接库以及库中的函数的引用地址(reference)。当一个Windows程序被装入内存之后,程序中的函数调用都被解析成DLL函数入口的指针,同时这些被调用的函数也被装入内存(如果还没有在内存中的话)。
当链接Windows程序以生成执行文件时,一定得链接你的编程环境所提供的特殊的“导入库”(import library)。这些导入库中包含所有Windows函数调用要碰到的动态链接库的名字以及引用信息。链接程序利用这些信息构建EXE文件中的表格,当装入程序的时候,Windows要靠这些表格来解析Windows函数调用。
(对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。)
|
|