![南昌航空大学C++实验指导书_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-10/19/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac1.gif)
![南昌航空大学C++实验指导书_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-10/19/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac2.gif)
![南昌航空大学C++实验指导书_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-10/19/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac3.gif)
![南昌航空大学C++实验指导书_第4页](http://file2.renrendoc.com/fileroot_temp3/2021-10/19/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac4.gif)
![南昌航空大学C++实验指导书_第5页](http://file2.renrendoc.com/fileroot_temp3/2021-10/19/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac/1825b103-5bf6-4571-9f8d-3ce8c7cd52ac5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计实验指导书任课教师:陈斌全二零零七年九月前 言本指导书是软件工程专业本科课程面向对象程序设计B的实验指导书,一般人员也可以使用它作为学习C+语言的上机指导。因为选择以Microsoft公司的C+开发环境Visual C+6.0作为实验环境,因此书的前一部分介绍了Visual C+的一些基本知识,并且在实验进行的过程中穿插介绍使用Visual C+的一些技巧。书的内容分为两大部分:第一部分介绍Visual C+实验环境;第二部分是具体的实验安排。使用本书前,请先阅读以下内容:1C+语言实验环境配置要求硬件配置:586以上PC兼容机或品牌机,配有彩色显示器、鼠标、键盘,内存不小于2
2、0MB,硬盘自由空间不少于60MB。推荐配置为内存32MB或64MB(或以上),硬盘自由空间500MB以上。软件配置:操作系统:Windows95, Windows98, Windows NT3.51以上版本。开发集成环境:Microsoft Visual C+5.0以上版本2建立自己的工作目录你需要在计算机上先建立自己的工作目录,所有的实验都在该工作目录下进行。使用Visual C+建立新项目时,需要指定该目录作为项目所在的目录。本书中假设你的工作目录为c:studentyour_name,具体的实验目录由你的指导教师指定。3安装Visual C+Visual C+ 6.0和Visual C
3、+ 5.0最大的不同是在联机帮助系统上做了很大改变。Visual C+ 5.0的帮助系统直接集成在开发环境之中,在安装Visual C+ 5.0时就可以选择安装帮助内容。而Visual C+ 6.0的联机帮助系统采用了MSDN(Microsoft Developer Network)库,在安装Visual C+ 6.0时,只安装了MSDN的索引,实际的内容在光盘上。如果希望能脱离光盘使用帮助系统,需要在安装了Visual C+ 6.0以后,再运行MSDN的安装程序,把完整的库装到硬盘上。第一部分 Visual C+实验环境介绍一、Visual C+简介Visual C+是Microsoft公司
4、的Visual Studio开发工具箱中的一个C+程序开发包。VisualStudio提供了一整套开发Internet和Windows应用程序的工具,包括VisualC+, Visual Basic, Visual Foxpro, Visual InterDev, Visual J+以及其他辅助工具,如代码管理工具Visual SourceSafe和联机帮助系统MSDN。Visual C+包中除包括C+编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。从最早期的1.0版本,发展到最新的6.0版本,Visual C+已经有了很大的变化,在界面、功能、库支持方面都有许多的增
5、强。最新的6.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。Visual C+一般分为三个版本:学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。实验中可以使用这三个版本的任意一种。Visual C+集成开发环境(IDE)集成开发环境(IDE)是一个将程序编辑器、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。Visual C+软件包中的Developer Studio就是一个集成开发环境,它集成了各种开发工具和VC编译器。程序员可以在不离开该环境的情况下编辑、编译、调试和运行一个应用程序。IDE中还提供大量在线帮
6、助信息协助程序员做好开发工作。Developer Studio中除了程序编辑器、资源编辑器、编译器、调试器外,还有各种工具和向导(如AppWizard和ClassWizard),以及MFC类库,这些都可以帮助程序员快速而正确地开发出应用程序。向导(Wizard)向导是一个通过一步步的帮助引导你工作的工具。Developer Studio中包含三个向导,用来帮助程序员开发简单的Windows程序,它们是:AppWizard:用来创建一个Windows程序的基本框架结构。AppWizard向导会一步步向程序员提出问题,询问他所创建的项目的特征,然后AppWizard会根据这些特征自动生成一个可以执
7、行的程序框架,程序员然后可以在这个框架下进一步填充内容。AppWizard支持三类程序:基于视图/文档结构的单文档应用、基于视图/文档结构的多文档应用程序和基于对话框的应用程序。也可以利用AppWizard生成最简单的控制台应用程序(类似于DOS下用字符输入输出的程序)。ClassWizard:用来定义AppWizard所创建的程序中的类。可以利用ClassWizard在项目中增加类、为类增加处理消息的函数等。ClassWizard也可以管理包含在对话框中的控件,它可以将MFC对象或者类的成员变量与对话框中的控件联系起来。ActiveX Control Wizard:用于创建一个ActiveX
8、控件的基本框架结构。ActiveX控件是用户自定义的控件,它支持一系列定义的接口,可以作为一个可再利用的组件。MFC库库(library)是可以重复使用的源代码和目标代码的集合。MFC(Microsoft Fundamental Casses)是Visual C+开发环境所带的类库,在该类库中提供了大量的类,可以帮助开发人员快速建立应用程序。这些类可以提供程序框架、进行文件和数据库操作、建立网络连接、进行绘图和打印等各种通用的应用程序操作。使用MFC库开发应用程序可以减少很多工作量。 二、项目开发过程在一个集成的开发环境中开发项目非常容易。一个用C+开发的项目的通用开发过程可以用左图表示。建立
9、一个项目的第一步是利用编辑器建立程序代码文件,包括头文件、代码文件、资源文件等。然后,启动编译程序,编译程序首先调用预处理程序处理程序中的预处理命令(如#include,#define等),经过预处理程序处理的代码将作为编译程序的输入。编译对用户程序进行词法和语法分析,建立目标文件,文件中包括机器代码、连接指令、外部引用以及从该源文件中产生的函数和数据名。此后,连接程序将所有的目标代码和用到的静态连接库的代码连接起来,为所有的外部变量和函数找到其提供地点,最后产生一个可执行文件。一般有一个makefile文件来协调各个部分产生可执行文件。 可执行文件分为两种版本:Debug和Release。D
10、ebug版本用于程序的开发过程,该版本产生的可执行程序带有大量的调试信息,可以供调试程序使用,而Release版本作为最终的发行版本,没有调试信息,并且带有某种形式的优化。学员在上机实习过程中可以采用Debug版本,这样便于调试。选择是产生Debug版本还是Release版本的方法是:在Developer Studio中选择菜单Build|Set Active Configuration,在弹出的对话框中,选择所要的类型,然后选择OK关闭对话框。Visual C+ 集成开发环境中集成了编辑器、编译器、连接器以及调试程序,覆盖了的开发应用程序的整个过程,程序员不需要脱离这个开发环境就可以开发出完
11、整的应用程序。三、集成开发环境Developer Studio进入Developer Studio如果你使用的是Visual C+ 6.0,则要进入Developer Studio,需要单击任务栏中“开始”后选择“程序”,找到Microsoft Visual Studio 6.0文件夹后,单击其中的Microsoft Visual C+6.0图标,则可以启动Developer Studio。如果你使用的是Visual C+ 5.0,则要进入Developer Studio,需要单击任务栏中“开始”后选择“程序”,找到Microsoft Visual C+ 5.0文件夹后,单击其中的Micros
12、oft Visual C+5.0图标,则可以启动Developer Studio。Developer Studio的界面Developer Studio用户界面是一个由窗口、工具条、菜单、工具及其他部分组成的一个集成界面。通过这个界面,用户可以在同一环境下创建、测试、调试应用程序。VC5和VC6的Developer Studio的初始化界面有一些小的差异,VC5的界面如下:主要部分介绍如下: 工具条和菜单,用于提供用户操作的命令接口。菜单以文字和层次化的方式提供命令接口,工具条由一系列按钮组成。这些按钮用一系列小的位图标志。工具条以图标方式提供快速的命令选择。菜单和工具条在开发的不同进程有不同
13、显示内容。当第一次打开Developer Studio时,标准的工具条和菜单就会显示出来,随着开发的不同步骤,不同的工具条就会自动显示出来,菜单也会有所变化。工具条有很多种,你可以显示任意多的工具条,只要屏幕空间允许。工具条可以任意移动,也可以放大缩小。工具条和菜单条功能基本相同,唯一的区别是:菜单条总占据一行,并且一般不能隐藏。 工作区窗口,这个窗口包含关于正在开发的这个项目的有关信息。在没有开发任何项目时,该窗口显示系统的帮助目录。当打开一个项目以后,工作区窗口将会显示关于当前项目的文件信息和类的信息。下图是打开一个项目hello以后的工作区窗口(假设该项目由两个文件cpp1.cpp, c
14、pp2.cpp组成)。 文档窗口区,这个区域可以显示各种类型的文档,如源代码文件、头文件、资源文件等。可以同时打开多个文档。 输出窗口,输出窗口用来显示几种信息,可以通过选择不同的标签显示不同的信息。这些信息包括:编译连接结果信息(Build标签)、调试信息(Debug标签)、查找结果信息(Find in Files标签)。其中查找结果信息有两个标签,可以显示两次在文件中查找指定内容的结果VC6因为在联机帮助系统上比VC5做了很大改进,所以在工作区窗口中没有VC5的InfoView,初始化界面的其他部分都与VC5相似。Deleveloper Studio使用Microsoft Develope
15、r Network(MSDN)库作为它的联机帮助系统。其界面如下:总的来说,窗口和命令接口(包括工具条和菜单条)是构成界面的最主要组成部分。通常有两种窗口:文档窗口和可附着(docking)窗口。文档窗口显示在文档窗口区,用于显示和编辑文档,其的大小和位置可以随其所处的Developer Studio窗口的改变而改变,可以最大化和最小化。可附着窗口可以附着于应用程序窗口的边界,也可以浮在屏幕上的任何位置。可附着窗口有:工作区(workspace)窗口,输出(output)窗口,调试窗口(包括variable, watch, local等窗口)等。文档窗口的位置、大小及是否可见和它所在的项目有关
16、,docking窗口的位置、大小及是否可见则与项目进行的状态以及各种编辑和调试的操作有关。各种窗口和各种工具条以及菜单构成了界面的布局。一旦用户决定了一种界面布局,系统就会为一直为用户保持这种布局,直到用户下一次改变该布局为止。获得帮助信息大多数时候,你可以通过按F1得到上下文帮助。如在编辑文件时按F1可以得到有关编辑的帮助,在编译连接错误信息上按F1可以得到关于该错误的帮助信息。如果想系统地获得帮助,在VC5中可以单击工作区窗口的InfoView标签,从其中选择要想了解的内容。要想查找关于某个话题的帮助,可以选择菜单Help|Search,在查询对话框中进行查找。VC6中,可以通过选择菜单H
17、elp|Contents来启动MSDN查阅器,MSDN查阅器是一个功能强大的程序,可以方便地浏览、查找信息,要想知道具体如何使用MSDN查阅器,可以在MSDN查阅器中选菜单Help下的命令。Visual C+的编辑器Developer Studio包含一个功能强大的编辑器,可以编辑将被编译成Windows程序的Visual C+源文件。这个编辑器有点象字处理器,但是没有字处理器具备的复杂的排版、文本格式等功能,它注重的是如何帮助程序员快速高效地编制程序。它具有以下特点: 自动语法。用高亮度和不同颜色的字来显示不同的语法成分,如注释、关键字和一般代码用不同的颜色显示 自动缩进。帮助你排列源代码,
18、使其可读性更强 参数帮助。在编辑时用到预定义的windows函数时,可以自动为你显示函数参数 集成的关键字帮助。能够使你快速得到任何关键字、MFC类或Windows函数的帮助信息(按F1即可) 拖放编辑。能够用鼠标选择文本并自由拖动到任意位置 自动错误定位。能自动将光标移动到有编译错误的源代码处。当你打开一个源代码文件时,就可以利用编辑器对其进行编辑。源代码文件在文档显示区显示,每个文件有独立的显示窗口。如果你选择用其他编辑器编辑源文件,必须将它以纯文本的方式保存。VC的编译器不能处理其中有特别格式字符的文件。四、常用功能键及其意义为了使程序员能够方便快捷地完成程序开发,开发环境提供了大量快捷
19、方式来简化一些常用操作的步骤。键盘操作直接、简单,而且非常方便,因而程序员非常喜欢采用键盘命令来控制操作。下面是一些最常用的功能键,希望学员在实验中逐步掌握。操作类型功能键对应菜单含义文件操作Ctrl+NFile|New创建新的文件、项目等Ctrl+OFile|Open打开项目、文件等Ctrl+SFile|Save保存当前文件编辑操作Ctrl+XEdit|Cut剪切Ctrl+CEdit|Copy复制Ctrl+VEdit|Paste粘贴Ctrl+ZEdit|Undo撤消上一个操作Ctrl+YEdit|Redo重复上一个操作Ctrl+AEdit|Select All全选DelEdit|Del删除光
20、标后面的一个字符建立程序操作Ctrl+F7Build| Compiler current file编译当前源文件Ctrl+F5Build|Run exe运行当前项目F7Build|Build exe建立可执行程序F5Build|Start Debugging启动调试程序调试F5Debug|Go继续运行F11Debug|Step into进入函数体内部shift+F11Debug|Step out从函数体内部运行出来F10Debug|Step over执行一行语句F9设置/清除断点Ctrl+F10Debug|Run to cursor运行到光标所在位置shift+F9Debug|QuickWat
21、ch快速查看变量或表达式的值Shift + F5Debug|Stop debugging停止调试第二部分 实验注意事项:(1) 每次实验以前,需要详细阅读实验目的、实验要求和实验提示,以便能准确地理解实验要求,达到实验的目的。有测试数据要求的,需要给出测试结果,有要求回答问题的,需要给出问题的回答。每次实验都有几个题目,要求为每个题目创建不同的项目,以便于检查。(2) 有的实验前后有联系,需要先完成前面的实验再进行后面的实验,如类和继承的实验。请务必按照先后顺序完成实验。(3) 辅导老师那儿有关于实验的详细解答,如果有疑问,可以请教辅导老师。实验一 类与结构1、实验目的了解和使用 VC+的集成
22、开发环境。熟悉 VC+集成开发环境的基本编辑命令及功能键 , 学会常规窗口操作。熟悉常用功能菜单命令。学习完整的 C+ 程序开发过程 ( 编辑、编译、连接、调试、运行及查看结果 ).理解简单的 C+ 程序结构。通过实验理解类与结构的区别,掌握类的定义,了解用户自定义数据类型。理解标准库函数,学习基本流输入输出(cout,cin)的用法。理解表达式的优先级、组合方式及语句及语句块。2、实验内容应用VC+6.0的编辑环境构造一个类Date,该类主要实现日期的基本操作,例如初始化(非构造函数)、求当前日期为星期几、当前年份是否为闰年、该日为该年第几天、输出等,具体说明如下:该类拥有三个私有(或保护)
23、成员变量year、month、day,分别代表日期中的年、月、日,成员函数有初始化函数、判断该年份是否为闰年函数、求当前日期为星期几函数、该日为该年第几天,结果输出函数等。其中:n 判断某一年是否为闰年的算法:该年份数字能被4整除但不能被100整除,或者能被4整除同时可被400整除,则为闰年n 求当前日期为星期几的算法: (1)0001年1月1日为星期一,可以计算从该天到当前日期的天数,然后除7求余,如余1则为星期一(2)if(month=1|month=2) year -=1; month +=12; return (day+1+2*month+3*(month+1)/5+year+(yea
24、r/4)-year/100+year/400)%7;n 求该日为该年第几天: 可以用循环实现,注意闰年的情况。实验二 构造函数1、实验目的通过实验理解构造函数的概念与其特殊应用。2、实验内容应用VC+6.0的编辑环境构造一个类Triangle,该类主要实现三角形的基本操作,例如初始化(构造函数及构造函数的重载)、求三角形的周长、面积、判断该三角形是什么三角形(等边、等腰、直角、等边直角、一般三角形、非三角形)、输出等,具体说明如下:class Trianglepublic:Triangle(double,double,double);Triangle(double,double);Triang
25、le(double);Triangle();double GetArea();double GetPerimeter();double Show();private:double a,b,c;实验三 析构函数1、实验目的通过实验理解析构函数的概念与其特殊应用。2、实验内容应用VC+6.0的编辑环境构造一个类Student,该类主要实现学生的基本操作,该学生类包含学生姓名、学生学号、学生成绩(课程数目不定,其存储空间应动态申请),实现对该学生信息的初始化、求该学生的总成绩、平均成绩、最高分与最低分以及最后输出,具体说明如下:class Studentpublic:Student(char *n,
26、char *s,int num,double *s);Student();double GetSum();double GetAver();double GetMax();double GetMin();void Show();private:char *name;/student namechar *stuno;/student noint score_num;/score numberdouble *score;/student score;实验四 静态成员与友元1、实验目的(1)学习静态成员的使用,理解静态成员的特殊用途。(2)学习友元函数及友元类,领会友元类的作用。2、实验内容应用VC
27、+6.0的编辑环境构造一个类Stack,设计一个整数链表类,实现栈操作。类中需有记录结点个数的数据成员(静态成员),要有判空操作。编制应用程序,取100次随机数(1000),如果取到的随机数比前一个随机数大的话,入栈,然后逐个取出(即出栈过程)求其和。用堆分配方法逐个产生满足条件(递增有序)的结点,插入栈中,每当出栈时,要及时将结点删除,求和工作放在类定义外(友元)。注意:栈中最多会有100个元素,最少会有一个元素,这是由条件(递增有序)决定的。具体说明如下:struct SNode int data; SNode *next;class Stackpublic:Stack();Stack()
28、;void Push(int e);/insert a data into stackint Pop();/delete a data from stackfriend int GetSum(Stack &);/get sum of stack,friend function /friend class getsum;/ get sum of stack,friend class,you can try it using friend classstatic int num;/static numberprivate:SNode *head;对栈的入栈过程与出栈过程说明如下:(1) 入栈,即向
29、栈中添加一个元素,且该元素只能添加到当前链表最后一个数据元素之后,此时记录数组元素数据个数的变量应该进行+操作;(2) 出栈,即从链表中删除一个数据元素,且该元素只能是当前栈中最后的一个元素,此时记录数据元素个数的变量应该进行-操作,也就是说,入栈及出栈的操作标识实际上是由记录数组中数据元素个数的变量实现的。(3) 判空,即判断当前栈(即链表)是否为空,也就是判断记录数组中数据元素个数的变量是否为0。rand()函数与srand()函数的使用说明:rand/srandGenerates a pseudorandom(伪随机的) rand( void );RoutineRe
30、quired HeaderCompatibilityrandANSI, Win 95, Win NTvoid srand( unsigned int seed );Return Valuerand returns a pseudorandom number, as described above. There is no error return.RemarksThe rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the srand function to seed the pseudo
31、random-number generator before calling rand.The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom
32、numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1.Example/* RAND.C: This program seeds the random-number generator * with the time, then displays 10 random integers. */#include #include #include void main( void ) int
33、i; /* Seed the random-number generator with current time so that * the numbers will be different every time we run. */ srand( (unsigned)time( NULL ) ); /* Display 10 numbers. */ for( i = 0; i 10;i+ ) printf( %6dn, rand() );Output6929 8026 21987 30734 20587 6699 22034 25051 7988 10104实验五 继承与多态性1、实验目的
34、根据现有类建立新类;学习构造基类和虚函数的用法。2、实验内容应用VC+6.0的编辑环境构造一个类Jhtx及其派生类,该类主要实现关于几何图形的基本操作。对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。 试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。CircleradiumsCircle()Circle()BallBall()Ball()GeometryGeometry()Geometry()GetArea()GetPerimeter()Getc
35、olume()show()ColumnColumn()Column()RectangleRectangle()Rectangle()实验六 运算符重载1、实验目的理解运算符重载(非成员形式和成员形式)、学习重载几类运算符(+,=,!=,+,-,=等)。2、实验内容应用VC+6.0的构建一个复数类Complex,试对下列几个运算符进行重载:+,=,!=,+,-,=,其中要求要有成员重载形式和友元重载形式,而且,+运算符要求实现先加和后加两种形式。该类定义原型说明:class complexpublic:complex(double r=0,double i=0);complex &operato
36、r +(complex &c);complex operator -(complex &c);complex operator *(complex &c);friend complex operator /(complex &c1,complex &c2);friend int operator =(complex &c1,complex &c2);friend int operator !=(complex &c1,complex &c2);/friend complex operator+(complex &c);complex operator+();void disp();privat
37、e:double real; double imag;实验七 动态链接库的制作与调用(多项式矩阵定义)1、实验目的综合运用所学面向对象编程知识完成动态链接库文件的创建、调用,理解动态链接库的工作原理,体会声明和定义分开方法在程序设计中的优势,掌握利用动态链接库实现不同开发平台间混合编程的方法,掌握利用动态链接库实现代码可复用技术,进一步掌握混合开发的方法。2、实验内容综合应用所学面向对象编程知识定义一个多项式矩阵类并应用该类实现多项式矩阵类的运算。具体实现该矩阵的加法(采用运算符“+”重载)、转置(采用运算符“-”重载)及输出(采用运算符“”重载)操作。将该类制作为动态链接库,然后在其他工程中
38、对该动态链接库进行调用。注:本次实验为四学时,其中前两个学时完成下面实验指导中给出的一个动态链接库的制作实例,后面两个学时在前面示例的基础上自行设计多项式矩阵的类的定义与使用。实验指导:先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库静态链接库动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文
39、件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。对动态链接库,我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C+还是Delphi。(2)动态链接库随处可见我们在Windows目录下的syste
40、m32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。(3)VC动态链接库的分类Visual C+支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MF
41、C Extension DLL(MFC扩展DLL)。非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。一个动态链接库的示例:首先我们做一个动态链接库提供add函数接口的方法,如图1,在VC+中new一个Win32 Dynamic-Link Library工程dllTest。注意不要选择MFC AppWizard(dll)。图1 建立一个非MFC DLL在建立的工程中添加lib.h及li
42、b.cpp文件,源代码如下:/* 文件名:lib.h*/#ifndef LIB_H#define LIB_Hextern C int _declspec(dllexport)add(int x, int y);#endif/* 文件名:lib.cpp*/#include lib.hint add(int x, int y)return x + y;这两个文件建立结束后,执行“build”命令完成动态链接库的编译与生成,此时,在该工程目录下的“debug”目录下则会生成dllTest.dll和dllTest.lib文件。然后,我们也建立一个与DLL工程处于同一工作区的应用工程dllCall,将刚
43、刚生成的两个文件拷贝到该共分成目录下,它调用DLL中的函数add,其源代码如下:/一、动态调用动态链接库方式#include #include typedef int(*lpAddFun)(int, int); /宏定义函数指针类型int main(int argc, char *argv)HINSTANCE hDll; /DLL句柄 lpAddFun addFun; /函数指针hDll = LoadLibrary(.DebugdllTest.dll);if (hDll != NULL)addFun = (lpAddFun)GetProcAddress(hDll, add);if (addFu
44、n != NULL)int result = addFun(2, 3);printf(%d, result);FreeLibrary(hDll);return 0;分析上述代码,在lib.h对函数add的声明前面添加了_declspec(dllexport)语句。这个语句的含义是声明函数add为DLL的导出函数。DLL内的函数分为两种:(1)DLL导出函数,可供应用程序调用;(2)DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。对下面语句进行逐一分析:首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数
45、指针类型。随后,在main函数中定义了lpAddFun的实例addFun;其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。DLL的调用方式在上面的例子中
46、我们看到了由“LoadLibrary-GetProcAddress-FreeLibrary”系统Api提供的三位一体“DLL加载-DLL函数地址获取-DLL释放”方式,这种调用方式称为DLL的动态调用。动态调用方式的特点是完全由编程者用 API 函数加载和卸载 DLL,程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。静态调用方式的特点是由编译系统完成对DLL的加载和应用程序结束时 DLL 的卸载。当调用某DLL的应用程序结束时,若系统中还有其它程序使用该 DLL,则Windows对DLL的应用记录减1,直到所有使用该DLL的程序都结束时才释放它。静态调
47、用方式简单实用,但不如动态调用方式灵活。下面我们来看看静态调用的例子,将编译dllTest工程所生成的.lib和.dll文件拷入dllCall工程所在的路径,dllCall执行下列代码:/二、静态调用动态链接库方式#pragma comment(lib,dllTest.lib) /.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息extern C _declspec(dllimport) add(int x,int y); int main(int argc, char* argv)int result = add(2,3); printf(%d,result);return 0;由上
48、述代码可以看出,静态调用方式的顺利进行需要完成两个动作:(1)告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragma comment(lib,dllTest.lib)就是起这个作用。程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包含了DLL 导出函数的符号名及序号(并不含有实际的代码)。在应用程序里,.lib文件将作为DLL的替代文件参与编译。(2)声明导入函数,extern C _declspec(dllimport) add(int x,int y)语句中的_declspec(dllimport)发挥这个作用。静态调用方式不再需要使用系统
49、API来加载、卸载DLL以及获取DLL中导出函数的地址。这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE 文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在 EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL 函数的动态链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。DLL导出类(实验重点内容)DLL中定义的类可以在应用工程中使用。下面的例子里,我们在DLL中定义了po
50、int和circle两个类,并在应用工程中引用了它们。/文件名:point.h,point类的声明#ifndef POINT_H#define POINT_H#ifdef DLL_FILEclass _declspec(dllexport) point /导出类point#elseclass _declspec(dllimport) point /导入类point#endifpublic:double y;double x;point();point(double x_coordinate, double y_coordinate);#endif/文件名:point.cpp,point类的实现
51、#ifndef DLL_FILE#define DLL_FILE#endif#include point.h/类point的缺省构造函数point:point()x = 0.0;y = 0.0;/类point的构造函数point:point(double x_coordinate, double y_coordinate)x = x_coordinate;y = y_coordinate;/文件名:circle.h,circle类的声明#ifndef CIRCLE_H#define CIRCLE_H#include point.h #ifdef DLL_FILEclass _declspec(dllexport)circle /导出类circle#elseclass _declspec(dllimport)circle /导入类circle#endifpublic:void SetCentre(const point &rePoint);void SetRadius(double r);double GetGirth();double GetArea();circle();private:doubl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年八年级数学上册第六章数据的分析1平均数教案新版北师大版
- 苏人版道德与法治九年级上册10.3《做一个成熟的消费者》听课评课记录
- 食品代工合同范本
- 计算机信息系统集成合同范本
- 校企战略合作框架合同范本
- 临时工聘任合同范本
- 统编版初中历史八年级上册 第二单元教材详解听课评课记录
- 人教版小学六年级数学上册第8单元《数学广角-数与形》单元测试题(含答案)共2套
- 鲁教版数学六年级下册9.3《用图象表示变量之间的关系》听评课记录2
- 湘教版数学七年级下册3.2《提单项式公因式》听评课记录
- 体验式沙盘-收获季节
- 老年护理陪护培训课件
- 2019年420联考《申论》真题(山西卷)试卷(乡镇卷)及答案
- 医院投诉纠纷及处理记录表
- YY/T 0698.5-2023最终灭菌医疗器械包装材料第5部分:透气材料与塑料膜组成的可密封组合袋和卷材要求和试验方法
- 酱香型白酒工厂设计
- 【深度教学研究国内外文献综述2100字】
- 牵引管道孔壁与管道外壁之间注浆技术方案
- 新人教版四年级下册数学教材解读课件
- 肛周脓肿完整版课件
- 公司(工厂)厂牌管理规定
评论
0/150
提交评论