资源预览内容
第1页 / 共31页
第2页 / 共31页
第3页 / 共31页
第4页 / 共31页
第5页 / 共31页
第6页 / 共31页
第7页 / 共31页
第8页 / 共31页
第9页 / 共31页
第10页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Visual C+,第三篇,VC,编程高级篇基于组件的编程与应用,VC,不仅能进行结构化的程序设计,还能进行面向对象的程序设计。,基于组件的程序设计就是解决不同程序语言开发的程序差异而出现的一种程序设计方法。在,VC,程序中,不仅可以开发组件供自己或别的程序语言来调用,而且还可以使用别的程序语言开发的组件。,本篇主要讲解利用,VC,编制组件和调用组件的方法与原理,,主要包括编制动态链接库和,COM,组件、调用,VC,自己开发的动态链接库和,COM,组件,以及结合数据库应用程序的开发,阐述了如何使用,Microsoft,的,ADO,数据访问组件来编写高效数据库客户端应用程序。,第13章动态链接库,13.1动态链接库概述,13.2 动态链接库的创建,13.3动态链接库的显式调用,习题,13.1动态链接库概述,动态链接库提供了一种代码共享机制,它可以有效地减小程序文件的尺寸和不必要的重复工作。,本章以一个包含递归分形树函数的.,DLL,的建立为例,重点讲解了动态链接库的建立方法,在,VC,中显式调用.,Dll,的方法,。,13.1.1动态链接库定义,13.1.2静态链接与动态链接,13.1.3函数的导出与导入,13.1.4隐式链接与显式链接,13.1.5搜索动态链接库,*13.1.6使用动态链接库的优点,13.1.1动态链接库定义,动态链接库,(,Dynamic Link Library,简称,DLL),是一个包含了若干函数的可执行模块,它实质上是一个函数包,,Windows,应用程序可以调用这些函数来完成实际的任务。,DLL,在,Windows,环境中起着重要的作用,Windows,利用,DLL,来建立,Windows,应用程序可以使用的,Windows,函数与资源。,动态链接库是一个文件,,其中包含有函数或全局变量,使用他们就像应用程序使用自己定义的函数一样。用,API,开发,Windows,应用程序,实质就是调用,Windows,操作系统下的动态链接库。,13.1.2静态链接与动态链接,DLL,与运行函数库(如,C,语言的运行函数库)类似,,二者主要区别,在于库代码的链接时机不同,。,静态链接库在多任务环境中建立与运行时效率可能很低。,一方面,,如果两个应用程序同时运行,且它们使用了同一个静态库中的函数,那么就要求系统中出现该函数的两个副本,这显然降低了内存的使用效率。,另一方面,,对于比较复杂的问题,应用静态链接库将导致最终的应用程序长度超过系统内存而无法运行。,DLL,是在运行期间才被链接进来,该操作由,Windows,操作系统自身来完成,而运行函数库则是在程序链接期间由应用程序的链接器如,LINK.EXE,来完成,运行函数库的链接被称为“静态链接”,它把函数代码链接到应用程序中,增加了应用程序最终执行代码的长度。它的主要优点是建立了一个应用程序可以利用的标准函数集,这样在开发应用程序时就无需包含函数库中所包含的函数源代码。,13.1.2静态链接与动态链接,(续),与静态链接库不同,动态链接库则允许若干个应用程序共享某个函数的单个副本。,事实上,每个,Windows API,函数,如,GetMesssage,()、,CreateWindow,(),和,TextOut,(),分别留于动态链接库,Kernel32.,dll,、User32.,dll,、Gdi32.,dll,之中。如果两个应用程序同时运行,且都使用了某个特定的,Windows,函数,那么它们将共享该函数代码的单个副本。,DLL,除了实现代码的共享外,还可以实现其它资源的共享,如数据和硬件资源的共享。,Windows,的设备驱动程序允许应用程序共享硬件资源,这些设备驱动程序就是以动态链接库的形式来出现。,从某种程度上讲,动态链接库也是一种类型的计算机资源。,一个动态链接库可以为多个应用程序使用,如果一个应用程序使用了某个动态链接库中函数,若库不存在,则调用将不能完成。,13.1.3函数的导出与导入,动态链接库是一个.,DLL,文件,它存放在特定的位置上,(13.1.5节讲)。程序员所创建的动态链接库中的函数要有导出标志,在使用动态链接库中的函数的程序中,要具有导入标志。,动态链接库中的函数并不是杂乱无章地堆放在一起,它们都有一个标志,即动态链接库中的,导出标志,。同样,如果应用程序要使用该库中的函数,也要向动态链接库发出“是否有我们想要的函数”,这通过,导入标志,来进行。双方必须达成一致后才能使用。,13.1.3函数的导出与导入,(续),1通过扩展关键字,dllexport,与,dllimport,指定,从一个动态链接库中导出一个函数可以通过如下的语句来完成,_,declspec,(,dllexport,)void,MyFunction,(,int,i),/,动态链接库中的函数,MyFunction,的实现代码,其中_,declspec,是一个扩展关键字,其作用和具有一个参数的函数类似,实际上,它与它的“参数”一起构成了一个“标志”,即“_,declspec,(,dllexport,)”,,该语句的含义为“出现在我后面的函数在当前的动态链接库文件中被合法导出,外部应用程序可以使用这个函数”。,从一个动态链接库中导入一个函数可以通过如下的语句来完成,_,declspec,(,dllimpot,)void,MyFunction,(,int,i);,_,declspec,(,dllimpot,),的含义为“出现在我后面的函数,MyFunction,是从动态链接库文件中导入的函数”。,13.1.3函数的导出与导入,(续),2通过,DEF,文件指定,动态链接库,DLL,是通过导出函数和变量来实现代码共享的,外部程序能通过这个导出过程来访问内部的函数和变量。,在,VC,下,除了使用编译指令,dllexport,与,dllimport,实现导出、导入函数的指定外,还可以通过,DLL,工程中的,DEF,文件来实现,利用应用程序向导生成的动态链接库中有一个和工程名同名的一个.,def,文件,例如建立一个在,mydll,.,dll,的动态链接库,则,生成的,mydll,.def,的主要内容如下:,(1),Def,的内容,;,mydll,.def:Declares the module parameters for the DLL.,LIBRARY ,mydll,DESCRIPTION ,mydll,Windows Dynamic Link Library,EXPORTS,;Explicit exports can go here,;,以下为用户手工填写的代码,它代表导出的函数名为,DrawTree,DrawTree,13.1.3函数的导出与导入,(续),(2)Def,的内容说明,AppWizard,生成的,mydll,.def,文件包含了关于,DLL,在,Windows,下运行的一些信息。在这个文件中定义了一些参数,包括,DLL,的名称和属性,还声明了从,DLL,中输出的函数。动态链接库的,DEF,文件中的注释行标志符和.,cpp,文件不一样,它用分号“;”表示,而不是用双斜线“/”表示。,第一行语句:,LIBRARY ,mydll,表示要建立的动态链接库文件的名称为“,myDll,”,,加在语句,EXPORT,后面的代码,DrawTree,表示可以被其它应用程序调用的函数。,语句,EXPORT,表示其后面的函数都可以被与该动态链接库链接的,EXE,应用程序调用,。,13.1.4隐式链接与显式链接,1,隐式链接,若在代码中没有明确指定应用程序要装入的动态链接库,但却使用其中的某个函数,这种链接的方式称为隐式链接。,利用,VC,可以编写各种,DLL,程序,其最终目的是在应用程序中调用,DLL。,链接,DLL,到可执行程序有,两种方式,:,隐式链接(,Implicit linking),显式链接(,Explicit linking),13.1.4隐式链接与显式链接,(续),2显式链接,显示链接,,又称显式调用,,是由编程者用,API,函数,LoadLibrary,(),加载,DLL、,并通过,GetProcessAddress,(),来获取应用程序要调用的导出函数指针来调用,DLL,的导出函数,最后通过,FreeLibrary,(),卸载,DLL。,它是一种动态调用的方式,通过它能够有效地使用内存,是编制大型应用程序的重要方式。,13.1.5搜索动态链接库,在,隐式调用,的应用程序运行时,需要寻找它所用的动态链接库,并且把它们加载到进程的虚拟地址空间内,为了使应用程序正常地使用动态链接库,必须将.,DLL,文件存放在下列任何一个子目录中,,Windows,操作系统也是,按照下列顺序来搜索动态链接库的:,(1)程序所在的当前目录(包含,EXE,可执行文件的目 录);,(2)进程的当前工作目录;,(3),Windows,系统目录(如,C:WindowsSystem,子目录);,(4),Windows,目录(如,C:Windows,子目录);,(5)在,Path,环境变量中列出的一系列目录。,*13.1.6使用动态链接库的优点,动态链接库非常有利于软件的编写和更新,,在编写程序时,可以把一个大型软件项目分割为多个单独模块,在这些模块中定义好它们的调用关系,然后分别由多个程序员进行编写。在各个模块内,程序员可以充分发挥他们的创造性,优化程序代码。而且,利用动态链接库对于软件的更新也是非常有好处的。在更新或者升级这个软件时,可以只更新这个软件的动态链接库。,现代应用程序广泛地使用,动态链接库,,其,好处,是,:,(1),同时运行的多个应用程序可以同时使用同一个动态链接库,它们在内存中只是共享,DLL,文件的一个拷贝。,(2),只要编写的应用程序函数、变量和返回值的类型和数量不发生变化,动态链接库中的函数可以不用重新编译链接而且直接使用,这一点明显优于静态链接;,(3),只要遵循一定的规则,不同语言编写的应用程序可以调用同一个动态链接库,而不管这个函数执行什么操作;,(4),在设计应用程序时,将其拆分成功能相互独立的部件.,DLL,为以后对这些功能部件各自升级提供较方便的途径;,(5),使资源数据独立于可执行程序之外,但又能较方便快速地访问它。,13.2动态链接库的创建,13.2.1 动态链接库的分类,13.2.2,DLL,工作原理,13.2.3 实现递归分形树的,Dll,13.2.1动态链接库的分类,利用,VC,的应用程序向导生成动态链接库程序的框架的方法是:在,VC,开发环境下,选择,File|New|Projects|MFC AppWizard(,Dll,),,在,Project Name,编辑框中输入一个工程名后,单击,OK,按钮就会出现图13.1所示的选择动态链接库类型的对话框。,VC,向导可以创建,三种类型的动态链接库,。,1普通静态链接,MFC,的,DLL,普通静态链接,MFC,的,DLL,就是,图13.1,的第一种类型(,Regular DLL With MFC static linked)。,该种形式的,DLL,可以被任何,Win32,的应用程序(不论是使用,API,开发的,还是使用,MFC,开发的)调用,但它不能与动态,MFC,链接。在该种,DLL,中,可以使用,MFC,类库,但使用的方式是静态链接。,13.2.1动态链接库的类,(续),2普通动态链接,MFC,的,DLL,普通动态链接,MFC,的,DLL,就是,图13.1,的第二种类型(,Regular DLL using shared MFC DLL)。,和第一种,DLL,相似,都可被任何,Win32,的应用程序(,API,开发的或使用,MFC,开发的)调用,只不过第一种,DLL,的函数是与,MFC,静态链接,而第二种,DLL,中的函数是与,MFC,动态链接。,3扩展的,DLL,扩展的,DLL,就是,图13.1,中的第三种
点击显示更多内容>>

最新DOC

最新PPT

最新RAR

收藏 下载该资源
网站客服QQ:3392350380
装配图网版权所有
苏ICP备12009002号-6