第13章动态链接库



《第13章动态链接库》由会员分享,可在线阅读,更多相关《第13章动态链接库(65页珍藏版)》请在文档大全上搜索。
1、第13章 动态链接库动态链接库是由用户自己开发的、可以加入到应用程序中作为提供某一特定功能的函数和类的集合。它可以被多个应用程序共享,并且只在运行时动态装载库文件。学习本章,读者可以掌握动态链接库的基本知识,同时可以了解动态链接库在钩子技术中的实际应用。13.1 什么是动态链接库动态链接库(Dynamic Link Library,DLL)是由函数等组成的二进制库文件,它可以被多个应用程序使用。应用程序在链接动态链接库时,并不把动态链接库中的函数复制到应用程序中,而只是记录函数的位置信息,程序在执行时,根据所记录的信息就可以找到目标函数的位置。可见动态链接库的动态含义就是执行时才真正地进行动态
2、链接。静态链接库是应用程序链接时将其全部代码复制到应用程序中,在链接完成以后,应用程序就不再需要静态链接库的支持。所谓动态和静态的含义就是说应用程序对链接库装入的时刻不同。动态链接库与静态链接库相比有着更多的优势。节省空间,动态链接库可以被多个程序共享,而静态链接库把库文件中的代码复制到应用程序中,这样使得应用程序占用的空间要增大许多。同时由于动态链接库支持多个应用程序共享DLL在内存中的同一份复制,这样就节省了内存空间,提高了程序的效率。独立性好,DLL文件是完全独立于可执行文件的,因此如果需要向DLL中增加新的函数或改变函数功能,只要原有函数的参数和返回值等属性不变,那么所有使用该DLL的
3、应用程序都可以使用改变后的DLL文件。但是由于应用程序是动态地调用动态链接库中的函数,这样无疑增加了一些程序运行时的开销,但这种开销对程序的执行效率并不明显,而且它的优势是静态链接库根本就无法实现的。动态链接库是一个可执行模块。但是它与应用程序有很大不同。它本身不能运行,必须在应用程序中使用。动态链接库包含了其所提供的函数的目标代码,在应用程序中可以使用它提供的函数。但是应用程序对动态链接库中的函数调用并不是把程序段复制到应用程序中,而是利用一个记录了动态链接库中函数信息的文件对函数进行动态链接。在应用程序中需要使用动态链接库函数的地方调用链接库的函数。在Windows系统中,很多资源的共享配
4、置,软件的设计都使用了动态链接库。其中在软件设计中,动态链接库最为常用的是语言资源的动态链接库。例如在Visual C+使用AppWizard生成应用程序时,可以指定资源文件使用的语言,这就是通过提供不同的动态链接库实现的。注意:使用动态链接库时,随同应用程序还要提供动态链接库文件(DLL文件)。例如,发布Visual C+编写的程序时,如果使用了动态连接,则在提供可执行文件的同时还需要提供Visual C+的动态链接库。在大多情况下,动态链接库和静态链接库的使用没有多大界限,但在某些情况下必须使用动态链接库。这些情况包括:在全局钩子函数中必须使用动态链接库;设备驱动程序必须是动态连接库。为了
5、实现应用程序的国际化,往往需要使用动态链接库。使用动态链接库可以将针对某一国家、地区的某种语言的信息存放在其中。上面介绍了动态链接库的基本概念,使用它可以实现软件的模块化设计。在Visual C+中对动态链接库的创建提供了支持。同时在Visual C+中可以方便地使用动态链接库进行程序设计。在13.2节将介绍在Visual C+中创建动态链接库的基本过程。13.2 创建动态链接库在Visual C+ 6.0中可以方便地创建动态链接库,它支持两种类型的动态链接库,即使用MFC的动态链接库和不使用MFC的Win32动态链接库,本节对这两种类型的动态链接库的创建进行介绍。13.2.1 创建MFC动态
6、链接库利用Visual C+ 6.0的应用程序向导可以方便地创建MFC动态链接库,具体步骤如下:(1)单击桌面上的Visual C+ 6.0应用程序图标,启动Visual C+ 6.0应用程序。(2)选择File | New命令,弹出New对话框,如图13.1所示。图13.1 New对话框(3)选择Peojects标签,选择MFC AppWizarddll选项,在“Project name:”文本框中输入工程文件名test。在“Location:”文本框中指定应用程序创建的位置。单击OK按钮,弹出MFC AppWizard Step 1 of 1对话框,如图13.2所示。图13.2 MFCAp
7、pWizard Step 1 of 1对话框图(4)在MFC AppWizard Step 1 of 1对话框中可以选择创建动态链接库的类型,下面对这3种类型进行介绍。Regular DLL With MFC statically linked:创建与MFC静态链接的常规DLL工程。MFC类库静态链接到将生成的DLL中,DLL中定义的函数可以被一般的Wn32应用程序和MFC应用程序使用。Regular DLL With MFC shared linked:创建与MFC动态链接的常规DLL工程,MFC类库动态地链接到将生成的DLL中,DLL中定义的函数可以被一般的Win32应用程序和MFC应用程
8、序使用。MFC Extension DLL:创建与MFC动态链接的扩展DLL,MFC类库动态地链接到将生成的DLL中,DLL中定义的函数只可以被MFC应用程序使用。选择一种创建类型后,单击Finish按钮,弹出New Project Information对话框,如图13.3所示。13.3 New Project Information对话框(5)在New Project Information对话框中列出了所建工程的信息,单击“OK”按钮,这时已经生成一个动态链接库工程。(6)编译、连接,在当前目录下的“Debug”文件夹下可以看到生成的DLL文件,此时并没有编写代码,向导生成了一个完整的动
9、态链接库工程。关于如何修改该工程和添加新的功能,在下一节进行介绍。13.2.2 创建Win32动态链接库在Visual C+ 6.0中也可以方便地创建不使用MFC的动态链接库,具体步骤如下:(1)单击桌面上的Visual C+ 6.0应用程序图标,启动Visual C+ 6.0。(2)选择File|New命令,弹出New对话框,如图13.4所示。图13.4 New对话框(3)选择Peojects标签,选择Win32 Dynamic Link Library选项,在“Project name:”文本框中输入工程文件名:test。在“Location:”文本框中指定应用程序创建的位置。单击OK按钮
10、,弹出Win32Dynamic-Link Library-Step 1 of 1对话框,如图13.5所示。图13.5 Win32 Dynamic-Link Library Step 1 of 1对话框(4)在MFC AppWizard Step1 of 1对话框中可以选择创建动态链接库的类型,下面对三种类型进行介绍。An empty DLL project:创建一个空的DLL工程,它自动生成dsw、dsp、ncb三个文件,但是不包含任何具有实际意义的文件,例如源文件、资源文件等。A Simple DLL project:创建一个简单的DLL工程,它生成一个完整的DLL工程。A DLL that
11、 exports some symbols:导出变量和函数的DLL工程。选择一种创建类型后,单击Finish按钮,弹出New Project Information对话框,如图13.6所示。图13.6 New Project Information对话框(5)在New Project Information对话框中列出了所建工程的信息,单击OK按钮,这时已经生成一个动态链接库工程。(6)如果选择的是后面两种类型,那么可以进行编译、连接,在当前目录下的“Debug”文件夹下可以看到生成的DLL文件。此时并没有编写代码,向导生成了一个完整的动态链接库工程。关于如何修改该工程和添加新的功能,在下一节