《动态链接库编程.ppt》由会员分享,可在线阅读,更多相关《动态链接库编程.ppt(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、动态链接库编程 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望12.1 基本概念在开发和使用动态链接库之前,有必要了解一下动态链接库的相关概念。只有了解了动态链接库的结构和工作机制,才能灵活有效地开发和使用它。12.1.1 动态链接库的概念动态链接库(DLL,Dynamic-Link Library)也是一种可执行文件,只不过它不能像普通的EXE文件那样可以直接运行,而是用来为其它可执行文件(包括EXE文件和其它DLL)提供共享函数库。使用DLL的应用程序可以调用
2、DLL中的导出函数,不过在应用程序本身的执行代码中并不包含这些函数的执行代码,它们经过编译和链接之后,独立的保存在DLL中。与动态链接库相对应,还有一种称为静态连接库的函数库,二者的主要区别就是在使用方法上。12.1.2 动态链接库的优点DLL在Windows编程中得到了广泛的应用。Windows API函数中的相当部分就是由一组DLL所提供的,这些DLL从安装Windows起就存在于系统中了。事实上,前面几章早就在使用DLL进行编程了,只不过,所使用的DLL都是现成的,并且所有调用DLL的操作都由Visual C+的编译和链接程序替用户完成了。12.1.3 Visual C+6.0可开发的D
3、LLVisual C+6.0支持多种DLL,包括:非MFC DLL、静态链接到MFC的常规DLL、动态链接到MFC的常规DLL和MFC扩展DLL。其中,非MFC DLL也称为Win32 DLL,其内部不采用MFC类库结构,导出函数一般为标准的C接口。它能被非MFC或MFC编写的应用程序所调用。(具体内容请参照本书)12.1.4 DLL文件的组成一个发布的可供使用的动态链接库,一般包含三个文件:包含文件(.H)、导入库文件(.LIB)和实际代码文件(.DLL)。(具体内容请参照本书)12.2 DLL的创建与调用本节以非MFC DLL(Win32 DLL)为例来讲解DLL的结构和导出方法,并介绍创
4、建和使用DLL的方法和步骤。12.2.1 Win32 DLL的创建与MFC应用程序框架的创建相似,使用AppWizard可以方便地创建一个Win32 DLL框架。本节将利用AppWizard创建一个Win32 DLL,该DLL提供了一个导出函数FactorialFun,实现正整数的阶乘运算(如,5!=5*4*3*2*1)。(具体内容请参照本书)12.2.2 DLL的导出DLL文件和EXE文件都属于可执行文件,不同的是DLL文件包含了一个导出表,导出表中给出了可以从DLL中导出的所有函数的名字。外部可执行程序只能访问包括在DLL的导出表中的函数,DLL中的其它函数是私有的,不能为外部可执行程序所
5、访问。从DLL中导出函数有两种方法:在定义函数时使用关键字_declspec(dllexport);在创建DLL时使用模块定义(.DEF)文件。(具体内容请参照本书)12.2.3 应用程序链接DLL链接应用程序到DLL也有两种方法:隐式链接和显式链接。隐式链接又称为静态加载。如果应用程序使用了隐式链接,操作系统在加载应用程序的同时加载应用程序所使用的DLL。显式链接又称为动态加载。使用动态加载的应用程序必须在代码中明确的加载所使用的DLL,并使用指针来调用DLL中的导出函数,在使用完毕之后,应用程序必须卸载所使用的DLL。(具体内容请参照本书)12.3 MFC常规DLL的创建与使用前面已经介绍
6、了普通DLL(Win32 DLL)的开发和使用,下面将要介绍基于MFC的DLL的开发。MFC DLL能够使用MFC类库,从而能在MFC的帮助下开发出功能强大的模块。基于MFC的DLL有MFC常规DLL和MFC扩展DLL,本节将介绍MFC常规DLL的创建与使用。12.3.1 基本概念MFC常规DLL,顾名思义,其包含两方面的含义。首先,它是MFC DLL,即可以在DLL的内部使用MFC类库。其次,它是常规的,即它不同于MFC扩展DLL,在其内部虽然可以使用MFC,但它与应用程序的接口不能是MFC,如它不能导出一个MFC类的派生类。MFC常规DLL有两种类型:静态链接到MFC库的规则DLL(Reg
7、ular DLL with MFC statically linked)和动态链接到MFC库的规则DLL(Regular DLL using shared MFC DLL)。从开发角度讲,两者的开发过程一样的。(具体内容请参照本书)12.3.2 MFC常规DLL的创建同样,使用AppWizard可以方便地创建一个MFC常规DLL框架程序。下面就详细介绍使用AppWizard向导创建MFC常规DLL的过程。12.3.3 MFC常规DLL创建实例本节将通过一个具体的实例讲解MFC常规DLL的创建过程。该DLL的导出函数实现创建一对话框。(具体内容请参照本书)3 3创建创建DLLDLL导出函数导出函
8、数创建导出函数需要新建一个源文件,执行“File”“New”菜单命令,利用New对话框为工程添加一C+源文件,命名为“DlgExport.cpp”12.3.4 MFC常规DLL的调用MFC常规DLL虽然其内部可能使用了MFC类库,但由于其接口是非MFC的,因此可以被非MFC应用程序调用,当然,MFC应用程序也可以调用它。本节同样通过一个控制台应用程序,显式调用上节开发的MFC常规DLLRegularDll.dll。12.4 MFC扩展DLL的创建与使用还可以使用DLL来实现从MFC派生的一些可重用类,这种动态链接库一般称作MFC扩展动态链接库(MFC Extension DLL)。通过这种方式
9、可以扩展MFC所包括的内容,使得使用MFC编程更加的方便。此外,如果需要在应用程序和DLL之间传递MFC,或者由MFC派生的对象的指针,也必须使用MFC扩展DLL。12.4.1 MFC扩展DLL的创建MFC扩展DLL支持C+的接口,也就是说它可以导出C+类给客户端。导出的函数可以使用C+/MFC数据类型做参数或返回值,导出一个类时,客户端能创建类对象或者派生这个类。因此,MFC扩展DLL的最大特点就是可以用来创建MFC的派生类。12.4.2 MFC扩展DLL的创建实例在本节中,将使用MFC扩展DLL来创建一个实现圆形按钮的按钮类CRoundButton,它派生自CButton类。当然,圆形按钮
10、也可以不使用DLL的形式,直接将CRoundButton类的头文件和源文件加入工程中。然而,每开发一个程序,要使用该类,都需将该类的头文件和源文件添加到工程中,很不方便。通过MFC扩展DLL,可以将该类发布为一个DLL,这样,应用程序在需要时就可以通过加载该DLL来实现。12.4.3 MFC扩展DLL的调用MFC扩展DLL只被用MFC类库所编写的应用程序所调用,本节将通过一个实例调用ExtensionDll.dll中创建的圆形按钮控件。12.5 DLL的查看与调试DLL开发中,DLL导出接口的查询与程序调试也是经常需要用到的技术。本节将介绍使用Depends工具查看DLL的导出接口以及DLL程
11、序的调试技术。12.5.1 使用Depends工具查看DLL接口Visual C+提供了Depends工具,使用它可以查看动态链接库的导出接口。在系统“开始”“所有程序”“Microsoft Visual Stadio 6.0”“Microsoft Visual Stadio 6.0 Tools”下会发现Depends工具。(具体内容请参照本书)12.5.2 DLL的调试可以用两种方法调试一个动态链接库。如果有DLL和调用程序的源代码,则可以将DLL工程与调用DLL工程放置在同一VC工作区,只对调用程序进行调试,在调用DLL中函数的语句处设置断点,执行到断点后,按下快捷键“F11”,就单步进入DLL中的函数。(具体内容请参照本书)