第二十一章 动态链接库
来源:互联网 发布:如何优化库存管理 编辑:程序博客网 时间: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了)问题是,它的操作方式比较麻烦,从载入、获得函数入口、释放资源,全部需要手动控制。
- 第二十一章 动态链接库
- 第二十一章
- 第十一章 动态链接库
- 第二十一章 条件语气
- 《佛密诸事》第二十一章:梦诏
- 梦里人第二十一章
- 第二章第二十一题
- 第三章第二十一题
- 第二章 第二十一题
- 第三章第二十一题
- 第三章第二十一题
- 第三章 第二十一题
- 第四章第二十一题
- 《道德经》第二十一章
- 第二十一章:并发(上)
- 动态链接库、静态链接库;动态链接、静态链接
- 动态链接,静态链接,动态链接库,静态链接库
- 应用程序链接动态链接库
- 提高搜索查询时的点击率/提高搜索流量的质量和数量
- ASP.NET 压缩和解压缩文件
- abap submit用法(一)调用外部程序(abap内存获取数据)
- Oracle中添加Job
- Apache手动安装Windows服务 (解决the requested operation h..)
- 第二十一章 动态链接库
- 时间格式化01
- dll导出函数
- 开发中应用的工具
- sap abap程序之间的调用
- 解析char *p与char p[]
- ubutnu 10.04 LTS版本即将发布
- 请求的名称有效 但是没有找到请求的类型的数据。
- ADODB.Recordset (0x800A0BB9)