没有合适的资源?快使用搜索试试~ 我知道了~
动态链接库入门教程
5星 · 超过95%的资源 需积分: 0 145 下载量 191 浏览量
2007-07-27
09:17:59
上传
评论 2
收藏 1006KB PDF 举报
温馨提示
试读
66页
比较好的动态链接库介绍
资源详情
资源评论
资源推荐
什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是 Dynamic Link
Library 的缩写形式,动态链接库 (DLL) 是作为共享函数库的可执行文件。动态
链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执
行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它
们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同
时访问内存中单个 DLL 副本的内容。
本文比较了Visual C++所支持的三种动态链接库,列出了各自不同的特点和应用
场合,详细地描述了三种动态链接库的建立和调用的方法。
关键字:动态链接库;导出函数;调用
引言
较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它
们彼此协作来完成整个软件系统的工作。在构造软件系统时,如果将所有模块的
源代码都静态编译到整个应用程序的EXE文件中,会产生一些问题:一个缺点是
增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的
内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每
次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于
阶段性的单元测试;而且,一些模块的功能可能较为通用,在构造其它软件系统
时仍会被使用。
Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可
以将独立的程序模块创建为较小的动态链接库(Dynamic Linkable Library,DLL)
文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些
DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE
文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序
使用。
动态链接库概述
动态链接库技术是Windows最重要的实现技术之一,Windows的许多新功能、
新特性都是通过DLL来实现的。其实,Windows本身就是由许多DLL组成的,它最
基本的三大组成模块Kernel、GDI和User都是DLL。
一般来说,DLL是一种磁盘文件,以.dll、.DRV、.FON、.SYS和许多以.EXE
为扩展名的系统文件都可以是DLL。它由全局数据、服务函数和资源组成,在运
行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL
之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含
各种导出函数,用于向外界提供服务,Windows在加载DLL模块时将进程函数调用
与DLL文件的导出函数相匹配。DLL可以有自己的数据段,但没有自己的堆栈,DLL
模块需要的堆栈内存都是从运行进程的堆栈中分配出来的,使用与调用它的应用
程序相同的堆栈模式;一个DLL在内存中只有一个实例;DLL实现了代码封装性;
DLL的编制与具体的编程语言及编译器无关。
动态链接库的分类
微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、
Regular Dll(常规DLL)、Extension Dll(扩展DLL)。
1、Non-MFC DLL(非MFC动态库)
这种动态链接库指的是不用MFC的类库结构,直接用C语言写的DLL,其导出
的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。如果建立的DLL
不需要使用MFC,那么应该建立Non-MFC DLL,因为使用MFC会增大用户库的大小,
从而浪费用户的磁盘和内存空间。
2、Regular DLL(常规DLL)
这种动态链接库和下述的Extension Dll一样,是用MFC类库编写的,它的一
个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从
CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函
数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用
程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是
在Visual C++、Delphi、Visual Basic、Borland C等编译环境下利用DLL开发应
用程序。常规DLL又可细分成静态链接到MFC和动态链接到MFC两种:
(1)静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。该类DLL
里的输出函数可以被任意Win32 程序使用,包括使用MFC的应用程序。输出函数
有如下形式:
extern "C" EXPORT YourExportedFunction( );
如果没有 extern "C"修饰,输出函数仅仅能从 C++代码中调用。
(2)动态链接到 MFC 的常规 DLL 里的输出函数可以被任意 Win32 程序使用,
包括使用 MFC 的应用程序。所有从 DLL 输出的函数应该以如下语句开始:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
此语句用来正确地切换 MFC 模块状态。
3、Extension Dll(扩展 DLL)
这种动态链接库是使用 MFC 的动态链接版本所创建的,并且它只被用 MFC
类库所编写的应用程序所调用。例如你已经创建了一个从 MFC 的 CtoolBar 类的
派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个 MFC
扩展的 DLL 中。扩展 DLL 和常规 DLL 不一样,它没有一个从 CWinApp 继承而来
的类的对象,所以,开发人员必须在 DLL 中的 DllMain 函数添加初始化代码和结
束代码。与常规 DLL 相比,扩展的 DLL 有如下不同点:
1) 它没有一个从 CWinApp 派生的对象;
2) 它必须有一个 DLLMain 函数;
3) DLLMain 调用 AfxInitExtensionModule 函数,必须检查该函数的返回值,
如果返回 0,DLLMmain 也返回 0;
4) 如果它希望输出 CRuntimeClass 类型的对象或者资源(Resources),则需
要提供一个初始化函数来创建一个 CDynLinkLibrary 对象。并且,有必要把初始
化函数输出;
5) 使用扩展 DLL 的 MFC 应用程序必须有一个从 CWinApp 派生的类,而且,
一般在 InitInstance 里调用扩展 DLL 的初始化函数。
动态连接库的建立
1、Non-MFC DLL 的建立
每一个 DLL 必须有一个入口点,就象用 C 编写的应用程序时,必须有一个
WINMAIN 函数一样。在 Non-MFC DLL 中 DllMain 是一个缺省的入口函数,你不需
要编写自己的 DLL 入口函数,用这个缺省的入口函数就能使动态链接库被调用时
得到正确的初始化。如果应用程序的 DLL 需要分配额外的内存或资源,或者说需
要对每个进程或线程初始化和清除操作时,需要在相应的 DLL 工程的.CPP 文件
中对 DllMain()函数按照下面的格式书写。
BOOL APIENTRY DllMain(HANDLE hModule,DWORD
ul_reason_for_call,LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
.......
case DLL_THREAD_ATTACH:
.......
case DLL_THREAD_DETACH:
.......
case DLL_PROCESS_DETACH:
.......
}
return TRUE;
}
参数中,hMoudle 是动态库被调用时所传递来的一个指向自己的句柄(实际
上,它是指向_DGROUP 段的一个选择符);
ul_reason_for_call 是一个说明动态库被调原因的标志,当进程或线程装入或
卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原
因,它所有的可能值为:
(1)DLL_PROCESS_ATTACH: 进程被调用或调用 Load Library,DLL 被链接到
当前进程的地址空间并被初始化;
(2)DLL_THREAD_ATTACH: 当前进程创建一个新线程,DLL 在新线程正文内被
调用;
剩余65页未读,继续阅读
daoxiangcun
- 粉丝: 3
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 简单小游戏制作-飞行棋
- Python数学建模例子.rar
- Java项目-基于SSM+JSP的校园外卖配送系统的设计与实现(源码+万字LW+部署视频+代码讲解视频+全套软件)
- Color-Transformer introduction
- FastStone Capture屏幕长截图软件包
- Table IoT物联网工具,简单快速的搭建物联网服务平台
- zheng2020 ecg new dataset-12 lead-add-label
- """YOLOv5-specific modules Usage: $ python path/to/models/y
- onnx-while-test.cpython-37
- 基于MapReduce的招聘数据清洗项目(免费提供源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1