全部博文(1293)
分类:
2013-01-05 21:16:12
一、DLL与操作系统
动态链接库DLL是windows操作系统的基础。windowsAPI中的所有函数都包含在DLL中。操作系统的核心功能、系统服务、应用程序等多数是由一组动态链接库实现的。动态链接库具有节省内在,支持多语种等多种好处。其中主要的是当动态链接库中的函数改变后,只要不改变参数,调用这个函数的应用程序并不需要重新编译,这样就可以减少应用程序的资源开销,提高效率。
二、什么是DLL
动态链接库DLL,Dynamic link library是在程序执行时,被动态地装载运行以完成一些通用功能的代码集合。它也可以是可执行文件 ,但是不能像EXE都样直接运行,而是用于为其他的可执行文件 (EXE文件或者其他DLL)提供共享代码的库。使用动态链接库,该文件 DLL不用被包含在最终的EXE文件中,EXE文件在执行时可动态地引用和卸载这个独立的DLL文件。与动态链接库相对应的,还有一种提供共享代码的方式的静态链接库,二者的主区别是使用方法的不同。
三、DLL的工作原理
在DLL中包含函数或类的执行代码和一个表,表中包含了函数的名字和地址。当加载DLL时可通过指针引出表,在表中查询并返回DLL要调用的函数地址,然后执行函数代码。如下图所示:
动态链接库所有的执行代码是共享的,可以有多个进程同时共享它的代码。
DLL是一个相对独立的应用程序,有它自己的模块够本和模块资源,多个应用程序可以同时使用一个DLL模块。但是不管有多少进程访问DLL,同一个DLL在内存中仅仅有一份。
windows对DLL提供访问自动计数功能,当访问计数大于或等于2时,DLL被加载到内存,而计数减为0时,DLL模块会自动卸载以释放其占有的内存空间。
四、DLL的分类
VC++一般支持3种DLL,分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC 扩展DLL)。
1、非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口;
2、MFC规则DLL采用MFC类库编写,其源文件中包含一个继承自CWinAPP的类,但是没有消息循环;
3、MFC扩展DLL采用MFC的动态链接版本创建,只能被用MFC类库所编写的应用程序调用,MFC扩展DLL支持C++接口,即该DLL可以导出定义在其内的类,应用程序可以构造这些类的对象,也可以从这些类派生。
五、导入/导出
导入是把DLL中的函数代码(或其他数据)插入到应用程序的过程;导出是把DLL中的函数代码(或其他数据)暴露出来为其他应用程序所使用的过程。
在开发DLL时,需要把一些函数或类导出,这些函数或类就被称为导出函数或导出类,而在使用DLL时,则需要把这些DLL的导出内容导入到应用程序中。