Windows动态链接库基础知识

来源:互联网 发布:网络推广怎么找客户 编辑:程序博客网 时间:2024/04/28 07:34

最近了解了一下Windows动态链接库的基础知识,现在整理一下,希望能对初学者有点帮助。
  如我们所知,Windows程序都是一些可执行文件,它们可以创建并显示一个或多个窗体,使用消息循环来接收用户的输入。但是动态链接库并不能直接被执行,它们一般也不会接收消息。它们只是一些包含着函数的独立文件,这些函数可以被Windows程序或者其它DLL调用以完成某项任务。
  “动态链接”是指Windows程序在运行时才把自己需要存在于某个库中的函数链接进来。“静态链接”是指Windows程序在编译阶段就把各种对象模块(.OBJ)、运行时库(.LIB)和资源文件(.RES)链接到一起以创建一个可执行文件(.EXE)。
  DERNAL32.DLL,USER32.DLL,GDI32.DLL,各种驱动程序如KEYBOARD.DRV,SYSTEM.DRV和MOUSE.DRV,显卡和打印机驱动程序等都是动态链接库。这些库可以被所有的Windows程序共同使用。
有某些动态链接库(如字体文件)称为“resource-only”。它们只包括数据,而不包括代码。因此,动态链接库的目的之一就是为许多不同的程序提供函数和资源。在传统的操作系统里,用户程序在运行时只能调用操作系统自身的某些函数。而在Windows操作系统下,模块或程序调用另一个模块中的函数来执行是一种非常普遍的操作。因此,从某种角度看,对DLL进行编程,其实是在对Windows操作系统作扩展,也可以看作是在对用户程序作扩展。
  动态链接库模块可以有其它的扩展名,但是标准的扩展名是.DLL。只有具有标准扩展句的动态链接库模块才可以被Windows自动加载。而如果是其它扩展名的动态链接库模块,程序必须使用LoadLibrary或者LoadLibraryEx函数来显示加载。
  我们可以发现,在大型的应用软件中,会常常使用到动态链接库技术。举个例子,假如我们要写一个大型的应用软件,其中包括了多个程序。我们可以发现很多程序可能都会使用到一些同样的通用的函数。我们可以把这些通用的函数放到某个目标库文件中(.LIB),然后在链接是把它加到每个程序中进行静态链接。但是这是一种非常浪费的方法,因为每个程序模块中都会包括这些通用函数的独立拷贝。另外,如果我们要改变库文件中的某个函数,就必须把所有使用到这个函数的程序都重新编译一遍。但是,如果我们使用动态链接库的技术,把所有这些通用函数都放到一个动态链接库文件当中,我们就可以解决以上提到的各种问题。首先,动态链接库在硬盘上只保留一个拷贝,程序只是在运行时才会调用其中使用到的函数,这样我们就可以节省大量的程序存储和运行空间。其次,如果要修改某个通用函数时,只要调用接口没有改变,只是改变它的实现方法,那么我们就不必对每个用到它的程序都进行重新编译,而只要把动态链接库模块重新编译一遍就可以了。
  动态链接库模块也可以作为一个单独的产品来发布。这样程序开发人员就可以使用第三方的模块来开发自己的应用程序,提高了程序的复用程序,也节省了大量的时间和精力。
  在很多时候时候,我们都会用到“库”(Library)这个词,除了动态链接库(Dynamic-Link   Libraries)之外,还有目标库(Object   Libraries)和导入库(Import   Libraries)。下面,我们分别了解一下这三种库的异同点。
  目标库是扩展名为.LIB的文件,包括了用户程序要用到的各种函数。它在用户程序进行链接时,“静态链接”到可执行程序文件当中。例如,在VC++中最常使用到的C运行时目标库文件就是LIBC.LIB。
  导入库是一种特殊形式的目标库文件形式。和目标库文件一样,导入库文件的扩展名也是.LIB,也是在用户程序被链接时,被“静态链接”到可执行文件当中。但是不同的是,导入库文件中并不包含有程序代码。相应的,它包含了相关的链接信息,帮助应用程序在可执行文件中建立起正确的对应于动态链接库的重定向表。比如KERNEL32.LIB、USER32.LIB和GDI32.LIB就是我们常用到的导入库,通过它们,我们就可以调用Windows提供的函数了。如果我们在程序中使用到了Rectangle这个函数,GDI32.LIB就可以告诉链接器,这个函数在GDI32.DLL动态链接库文件中。这样,当用户程序运行时,它就知道“动态链接”到GDI32.DLL模块中以使用这个函数。
  目标库和导入库都是在程序开发过程中才使用到的,而动态链接库是在程序运行时才使用的。在程序运行时,相应的动态链接库文件必须已经保存在硬盘上了。另外,如果要使用动态链接库文件,该文件必须要保存在同.EXE文件同一个目录下,或者保存在当前目录、Windows系统目录、Windows目录或环境变量中PATH参数指定的目录下。程序也是按照这个顺序来搜寻它需要的动态链接库文件的。
  PS:以上内容基本上都是对《Programming   Windows   Fifth   Edition》一书第21章前面两个小节的翻译和整理,如果各位朋友还想了解关于Windows   DLL的更多知识和内容,可以参看此书。

原创粉丝点击