第二十一章 动态链接库

来源:互联网 发布:如何优化库存管理 编辑:程序博客网 时间:2024/05/21 18:35

多数与Windows相关的磁盘文件如果不是程序模块,就是动态链接程序。

21.1动态链接库的基本知识

动态链接库并不能直接执行,也不接收消息。它们一些独立的文件,其中包含能被程序或其它DLL呼叫来完成一定作业的函数。只有在其它模块呼叫动态链接库中的函数时,它才发挥作用。

在程序开发中,您将各种目标模块(.OBJ)、执行时期链接库(.LIB)文件,以及经常是已编译的资源(.RES)文件连结在一起,以便建立Windows的.EXE文件,这时的连结是「静态连结」。动态链接与此不同,它发生在执行时期。

KERNEL32.DLL 、 USER32.DLL 和 GDI32.DLL、各种驱动程序文件如KEYBOARD.DRV、SYSTEM.DRV和MOUSE.DRV和视讯及打印机驱动程序都是动态链接库。这些动态链接库能被所有Windows应用程序使用。

尽管一个动态链接库模块可能有其它扩展名(如.EXE或.FON) ,但标准扩展名是.DLL。如果文件有其它扩展名,则程序必须另外使用LoadLibrary或者LoadLibraryEx函数加载该模块。

链接库:一词多义

目的码链接库是带.LIB扩展名的文件。在使用连结程序进行静态连结时,它的程序代码就会加到程序的.EXE文件中。引用链接库是目的码链接库文件的一种特殊形式。像目的码链接库一样,引用链接库有.LIB扩展名,并且被连结器用来确定程序代码中的函数呼叫来源。但引用链接库不含程序代码,而是为连结程序提供信息,以便在.EXE文件中建立动态链接时要用到的复位位表。包含在Microsoft编译器中的KERNEL32.LIB、USER32.LIB和GDI32.LIB文件是Windows函数的引用链接库。

一个简单的DLL

EDRLIB工程(.h)

EDRLIB工程(.cpp)

链接库入口/出口点

在DLL中共享内存

Windows能够将同时使用同一个动态链接库的应用程序分开.

STRLIB.h

STRLIB.cpp

 

STRPROG.cpp

 

 

21.2各式各样的 DLL 讨论

动态链接库模块不接收消息,但是,动态链接库模块可呼叫GetMessage和PeekMessage。

在链接库中登录窗口类别和建立窗口需要一点技巧。窗口类别结构和CreateWindow呼叫都需要执行实体句柄。如果使用必须在链接库中建立窗口类别和窗口,最好的方法可能是使用呼叫程序的执行实体句柄。

因为模态对话框的消息是在程序的消息循环之外接收到的,因此使用者可以在链接库中呼叫DialogBox来建立模态对话框。执行实体句柄可以是链接库句柄,并且DialogBox的hwndParent参数可以为NULL。

不用输入引用信息的动态链接 

程序执行时也可以把程序同动态链接库模块连结到一起。

Windows为所有的动态链接库模块提供「引用计数」 ,LoadLibrary使引用计数递增。当Windows加载任何使用了链接库的程序时,引用计数也会递增。

纯资源链接库

由Windows程序或其它链接库使用的动态链接库中的任何函数都必须被输出。 然而,DLL也可以不包含任何输出函数。DLL还可以包含资源透过链接库句柄和位图号码来呼叫LoadBitmap,从而得到一个位图句柄:

DLL载入方式的比较:

■dll静态加载法:lib是dll的导入库,这个方法很简单,但是有2个缺点:1程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行;2由于载入的是整个dll,需要耗费资源。

■动态加载法:它不在程序运行时候载入dll,不需要lib导入,使用程序函数LoadLibrary载入库,并使用API获得dll中的函数入口地址。相对的,它只导入需要的函数,资源节俭,程序启动无需载入dll,效率高,即使dll没有,程序也可以正常启动(但是执行到需要dll部分就over了)问题是,它的操作方式比较麻烦,从载入、获得函数入口、释放资源,全部需要手动控制。

 

原创粉丝点击