收藏 分销(赏)

实验指导书.docx

上传人:人****来 文档编号:3398299 上传时间:2024-07-04 格式:DOCX 页数:41 大小:262.14KB
下载 相关 举报
实验指导书.docx_第1页
第1页 / 共41页
实验指导书.docx_第2页
第2页 / 共41页
实验指导书.docx_第3页
第3页 / 共41页
实验指导书.docx_第4页
第4页 / 共41页
实验指导书.docx_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、面向对象程序设计面向对象程序设计 实实 验验 指指 导导 书书 段喜龙段喜龙 九月九月 前言前言 本指导书是软件工程专业本科课程面向对象程序设计 B的实验指导书,一般人员也可以使用它作为学习 C+语言的上机指导。由于选择以 Microsoft 公司的 C+开发环境 VisualC+6.0 作为实验环境,因此书的前一部分介绍了 VisualC+的一些基本知识,并且在实验进行的过程中穿插介绍使用VisualC+的一些技巧。书的内容分为两大部分:第一部分介绍 VisualC+实验环境;第二部分是具体的实验安排。使用本书前,请先阅读以下内容:使用本书前,请先阅读以下内容:1C+语言实验环境配置规定 硬

2、件配置硬件配置:586 以上 PC 兼容机或品牌机,配有彩色显示器、鼠标、键盘,内存不小于 20MB,硬盘自由空间不少于 60MB。推荐配置推荐配置为内存 32MB 或 64MB(或以上),硬盘自由空间 500MB 以上。软件配置软件配置:操作系统:Windows95,Windows98,WindowsNT3.51 以上版本。开发集成环境开发集成环境:MicrosoftVisualC+5.0 以上版本 2建立自己的工作目录 你需要在计算机上先建立自己的工作目录,所有的实验都在该工作目录下进行。使用 VisualC+建 立 新 项 目 时,需 要 指 定 该 目 录 作 为 项 目 所 在 的

3、目 录。本 书 中 假 设 你 的 工 作 目 录 为c:studentyour_name,具体的实验目录由你的指导教师指定。3安装 VisualC+VisualC+6.0 和 VisualC+5.0 最大的不同是在联机帮助系统上做了很大改变。VisualC+5.0 的帮助系统直接集成在开发环境之中,在安装 VisualC+5.0 时就可以选择安装帮助内容。而 VisualC+6.0的联机帮助系统采用了 MSDN(MicrosoftDeveloperNetwork)库,在安装 VisualC+6.0 时,只安装了MSDN 的索引,实际的内容在光盘上。假如希望能脱离光盘使用帮助系统,需要在安装了

4、 VisualC+6.0以后,再运营 MSDN 的安装程序,把完整的库装到硬盘上。第一部分第一部分 VisualC+实验环境介绍实验环境介绍 一、一、VisualC+简介简介 VisualC+是 Microsoft 公司的 VisualStudio 开发工具箱中的一个 C+程序开发包。VisualStudio提 供 了 一 整 套 开 发Internet和Windows应 用 程 序 的 工 具,涉 及VisualC+,VisualBasic,VisualFoxpro,VisualInterDev,VisualJ+以及其他辅助工具,如代码管理工具VisualSourceSafe和联机帮助系统M

5、SDN。VisualC+包中除涉及C+编译器外,还涉及所有的库、例子和为创建 Windows 应用程序所需要的文档。从最初期的 1.0 版本,发展到最新的 6.0 版本,VisualC+已有了很大的变化,在界面、功能、库支持方面都有许多的增强。最新的 6.0 版本在编译器、MFC 类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改善。VisualC+一般分为三个版本:学习版、专业版和公司版,不同的版本适合于不同类型的应用开发。实验中可以使用这三个版本的任意一种。VisualC+VisualC+集成开发环境(集成开发环境(IDEIDE)集成开发环境集成开发环境(IDE)是一个将程序编辑器

6、、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。VisualC+软件包中的 DeveloperStudioDeveloperStudio 就是一个集成开发环境,它集成了各种开发工具和 VC 编译器。程序员可以在不离开该环境的情况下编辑、编译、调试和运营一个应用程序。IDE 中还提供大量在线帮助信息协助程序员做好开发工作。DeveloperStudio中除了程序编辑器、资源编辑器、编译器、调试器外,尚有各种工具和向导(如 AppWizard 和ClassWizard),以及 MFC 类库,这些都可以帮助程序员快速而对的地开发出应用程序。向导向导(Wizard)(

7、Wizard)向导是一个通过一步步的帮助引导你工作的工具。DeveloperStudio 中包含三个向导,用来帮助程序员开发简朴的 Windows 程序,它们是:AppWizardAppWizard:用来创建一个 Windows 程序的基本框架结构。AppWizard 向导会一步步向程序员提出问题,询问他所创建的项目的特性,然后 AppWizard 会根据这些特性自动生成一个可以执行的程序框架,程序员然后可以在这个框架下进一步填充内容。AppWizard 支持三类程序:基于视图/文档结构的单文档应用、基于视图/文档结构的多文档应用程序和基于对话框的应用程序。也可以运用AppWizard 生成最

8、简朴的控制面板应用程序(类似于 DOS 下用字符输入输出的程序)。ClassWizardClassWizard:用来定义 AppWizard 所创建的程序中的类。可以运用 ClassWizard 在项目中增长类、为类增长解决消息的函数等。ClassWizard 也可以管理包含在对话框中的控件,它可以将 MFC 对象或者类的成员变量与对话框中的控件联系起来。ActiveXControlWizardActiveXControlWizard:用于创建一个 ActiveX 控件的基本框架结构。ActiveX 控件是用户自定义的控件,它支持一系列定义的接口,可以作为一个可再运用的组件。MFCMFC 库库

9、 库(library)是可以反复使用的源代码和目的代码的集合。MFC(MicrosoftFundamentalCasses)是 VisualC+开发环境所带的类库,在该类库中提供了大量的类,可以帮助开发人员快速建立应用程序。这些类可以提供程序框架、进行文献和数据库操作、建立网络连接、进行绘图和打印等各种通用的应用程序操作。使用 MFC 库开发应用程序可以减少很多工作量。二、项目开发过程二、项目开发过程 在一个集成的开发环境中开发项目非常容易。一个用 C+开发的项目的通用开发过程可以用左图表达。建立一个项目的第一步是运用编辑编辑器建立程序代码文献,涉及头文献、代码文献、资源文献等。然后,启动编译

10、程序,编译程序一方面调用预解决预解决程序解决程序中的预解决命令(如#include,#define等),通过预解决程序解决的代码将作为编译程序的输入。编译对编译对用户程序进行词法和语法分析,建立目的文献,文献中涉及机器代码、连接指令、外部引用以及从该源文献中产生的函数和数据名。此后,连接连接程序将所有的目的代码和用到的静态连接库的代码连接起来,为所有的外部变量和函数找到其提供地点,最后产生一个可执行文献。一般有一个 makefile 文献来协调各个部分产生可执行文献。可执行文献分为两种版本:Debug 和 Release。Debug 版本用于程序的开发过程,该版本产生的可执行程序带有大量的调试

11、信息,可以供调试程序使用,而 Release 版本作为最终的发行版本,没有调试信息,并且带有某种形式的优化。学员在上机实习过程中可以采用 Debug 版本,这样便于调试。选择是产生 Debug 版本还是 Release 版本的方法是:在 DeveloperStudio 中选择菜单Build|SetActiveConfiguration,在弹出的对话框中,选择所要的类型,然后选择 OK 关闭对话框。VisualC+集成开发环境中集成了编辑器、编译器、连接器以及调试程序,覆盖了的开发应用程序的整个过程,程序员不需要脱离这个开发环境就可以开发出完整的应用程序。三、集成开发环境三、集成开发环境 Dev

12、eloperStudio 进入进入 DeveloperStudio 假如你使用的是 VisualC+6.0,则要进入 DeveloperStudio,需要单击任务栏中“开始开始”后选择“程程序序”,找到 MicrosoftVisualStudio6.0 文献夹后,单击其中的 MicrosoftVisualC+6.0 图标,则可以启动DeveloperStudio。假如你使用的是 VisualC+5.0,则要进入 DeveloperStudio,需要单击任务栏中“开始开始”后选择“程程序序”,找到 MicrosoftVisualC+5.0 文献夹后,单击其中的 MicrosoftVisualC+

13、5.0 图标,则可以启动DeveloperStudio。DeveloperStudio 的界面的界面 DeveloperStudio 用户界面是一个由窗口、工具条、菜单、工具及其他部分组成的一个集成界面。通过这个界面,用户可以在同一环境下创建、测试、调试应用程序。VC5 和 VC6 的 DeveloperStudio 的初始化界面有一些小的差异,VC5 的界面如下:重要部分介绍如下:重要部分介绍如下:工具条和菜单,用于提供用户操作的命令接口。菜单以文字和层次化的方式提供命令接口,工具条由一系列按钮组成。这些按钮用一系列小的位图标志。工具条以图标方式提供快速的命令选择。菜单和工具条在开发的不同进

14、程有不同显示内容。当第一次打开 DeveloperStudio 时,标准的工具条和菜单就会显示出来,随着开发的不同环节,不同的工具条就会自动显示出来,菜单也会有所变化。工具条有很多种,你可以显示任意多的工具条,只要屏幕空间允许。工具条可以任意移动,也可以放大缩小。工具条和菜单条功能基本相同,唯一的区别是:菜单条总占据一行,并且一般不能隐藏。工作区窗口,这个窗口包含关于正在开发的这个项目的有关信息。在没有开发任何项目时,该窗口显示系统的帮助目录。当打开一个项目以后,工作区窗口将会显示关于当前项目的文档信息和类的信息。下图是打开一个项目 hello 以后的工作区窗口(假设该项目由两个文献cpp1.

15、cpp,cpp2.cpp 组成)。文档窗口区,这个区域可以显示各种类型的文档,如源代码文献、头文献、资源文献等。可以同时打开多个文档。输出窗口,输出窗口用来显示几种信息,可以通过选择不同的标签显示不同的信息。这些信息涉及:编译连接结果信息(Build 标签)、调试信息(Debug 标签)、查找结果信息(FindinFiles 标签)。其中查找结果信息有两个标签,可以显示两次在文献中查找指定内容的结果 VC6 由于在联机帮助系统上比 VC5 做了很大改善,所以在工作区窗口中没有 VC5 的 InfoView,初始化界面的其他部分都与 VC5 相似。DeleveloperStudio 使用 Mic

16、rosoftDeveloperNetwork(MSDN)库作为它的联机帮助系统。其界面如下:总的来说,窗口和命令接口(涉及工具条和菜单条)是构成界面的最重要组成部分。通常有两种窗口:文档窗口和可附着(docking)窗口。文档窗口显示在文档窗口区,用于显示和编辑文档,其的大小和位置可以随其所处的 DeveloperStudio 窗口的改变而改变,可以最大化和最小化。可附着窗口可以附着于应用程序窗口的边界,也可以浮在屏幕上的任何位置。可附着窗口有:工作区(workspace)窗口,输出(output)窗口,调试窗口(涉及 variable,watch,local 等窗口)等。文档窗口的位置、大小

17、及是否可见和它所在的项目有关,docking 窗口的位置、大小及是否可见则与项目进行的状态以及各种编辑和调试的操作有关。各种窗口和各种工具条以及菜单构成了界面的布局。一旦用户决定了一种界面布局,系统就会为一直为用户保持这种布局,直到用户下一次改变该布局为止。获得帮助信息获得帮助信息 大多数时候,你可以通过按 F1 得到上下文帮助。如在编辑文献时按 F1 可以得到有关编辑的帮助,在编译连接错误信息上按 F1 可以得到关于该错误的帮助信息。假如想系统地获得帮助,在 VC5中可以单击工作区窗口的 InfoView 标签,从其中选择要想了解的内容。要想查找关于某个话题的帮助,可以选择菜单 Help|S

18、earch,在查询对话框中进行查找。VC6 中,可以通过选择菜单 Help|Contents来启动 MSDN 查阅器,MSDN 查阅器是一个功能强大的程序,可以方便地浏览、查找信息,要想知道具体如何使用 MSDN 查阅器,可以在 MSDN 查阅器中选菜单 Help 下的命令。VisualC+的编辑器的编辑器 DeveloperStudio 包含一个功能强大的编辑器,可以编辑将被编译成 Windows 程序的 VisualC+源文献。这个编辑器有点象字解决器,但是没有字解决器具有的复杂的排版、文本格式等功能,它注重的是如何帮助程序员快速高效地编制程序。它具有以下特点:自动语法。用高亮度和不同颜色

19、的字来显示不同的语法成分,如注释、关键字和一般代码用不同的颜色显示 自动缩进。帮助你排列源代码,使其可读性更强 参数帮助。在编辑时用到预定义的 windows 函数时,可以自动为你显示函数参数 集成的关键字帮助。可以使你快速得到任何关键字、MFC 类或 Windows 函数的帮助信息(按F1 即可)拖放编辑。可以用鼠标选择文本并自由拖动到任意位置 自动错误定位。能自动将光标移动到有编译错误的源代码处。当你打开一个源代码文献时,就可以运用编辑器对其进行编辑。源代码文献在文档显示区显示,每个文献有独立的显示窗口。假如你选择用其他编辑器编辑源文献,必须将它以纯文本的方式保存。VC 的编译器不能解决其

20、中有特别格式字符的文献。四、常用功能键及其意义四、常用功能键及其意义 为了使程序员可以方便快捷地完毕程序开发,开发环境提供了大量快捷方式来简化一些常用操作的环节。键盘操作直接、简朴,并且非常方便,因而程序员非常喜欢采用键盘命令来控制操作。下面是一些最常用的功能键,希望学员在实验中逐步掌握。操作类型 功能键 相应菜单 含义 文献操作 Ctrl+N File|New 创建新的文献、项目等 Ctrl+O File|Open 打开项目、文献等 Ctrl+S File|Save 保存当前文献 编辑操作 Ctrl+X Edit|Cut 剪切 Ctrl+C Edit|Copy 复制 Ctrl+V Edit|

21、Paste 粘贴 Ctrl+Z Edit|Undo 撤消上一个操作 Ctrl+Y Edit|Redo 反复上一个操作 Ctrl+A Edit|SelectAll 全选 Del Edit|Del 删除光标后面的一个字符 建立程序操作 Ctrl+F7 Build|Compilercurrentfile 编译当前源文献 Ctrl+F5 Build|Runexe 运营当前项目 F7 Build|Buildexe 建立可执行程序 F5 Build|StartDebugging 启动调试程序 调试 F5 Debug|Go 继续运营 F11 Debug|Stepinto 进入函数体内部 shift+F11

22、Debug|Stepout 从函数体内部运营出来 F10 Debug|Stepover 执行一行语句 F9 设立/清除断点 Ctrl+F10 Debug|Runtocursor 运营到光标所在位置 shift+F9 Debug|QuickWatch 快速查看变量或表达式的值 Shift+F5 Debug|Stopdebugging 停止调试 第二部分实验第二部分实验 注意事项:(1)每次实验以前,需要具体阅读实验目的、实验规定和实验提醒,以便能准确地理解实验规定,达成实验的目的。有测试数据规定的,需要给出测试结果,有规定回答问题的,需要给出问题的回答。每次实验都有几个题目,规定为每个题目创建不

23、同的项目,以便于检查。(2)有的实验前后有联系,需要先完毕前面的实验再进行后面的实验,如类和继承的实验。请务必按照先后顺序完毕实验。(3)辅导老师那儿有关于实验的具体解答,假如有疑问,可以请教辅导老师。实验一类与结构实验一类与结构 1 1、实验目的、实验目的 了解和使用VC+的集成开发环境。熟悉VC+集成开发环境的基本编辑命令及功能键,学会常规窗口操作。熟悉常用功能菜单命令。学习完整的C+程序开发过程(编辑、编译、连接、调试、运营及查看结果).理解简朴的C+程序结构。通过实验理解类与结构的区别,掌握类的定义,了解用户自定义数据类型通过实验理解类与结构的区别,掌握类的定义,了解用户自定义数据类型

24、。理解标准库函数,学习基本流输入输出(cout,cin)的用法。理解表达式的优先级、组合方式及语句及语句块。2 2、实验内容、实验内容 应用VC+6.0 的编辑环境构造一个类Date,该类重要实现日期的基本操作,例如初始化(非构造函数)、求当前日期为星期几、当前年份是否为闰年、该日为该年第几天、输出等,具体说明如下:该类拥有三个私有(或保护)成员变量year、month、day,分别代表日期中的年、月、日,成员函数有初始化函数、判断该年份是否为闰年函数、求当前日期为星期几函数、该日为该年第几天,结果输出函数等。其中:判断某一年是否为闰年的算法:该年份数字能被 4 整除但不能被 100 整除,或

25、者能被 4 整除同时可被 400 整除,则为闰年 求当前日期为星期几的算法:(1)0020231 月 1 日为星期一,可以计算从该天到当前日期的天数,然后除 7 求余,如余 1 则为星期一(2)if(month=1|month=2)year-=1;month+=12;return(day+1+2*month+3*(month+1)/5+year+(year/4)-year/100+year/400)%7;求该日为该年第几天:可以用循环实现,注意闰年的情况。实验二构造函数实验二构造函数 1 1、实验目的、实验目的 通过实验理解构造函数的概念与其特殊应用。2 2、实验内容、实验内容 应用VC+6.

26、0 的编辑环境构造一个类Triangle,该类重要实现三角形的基本操作,例如初始化(构造函数及构造函数的重载)、求三角形的周长、面积、判断该三角形是什么三角形(等边、等腰、直角、等边直角、一般三角形、非三角形)、输出等,具体说明如下:classTriangle public:Triangle(double,double,double);Triangle(double,double);Triangle(double);Triangle();doubleGetArea();doubleGetPerimeter();doubleShow();private:doublea,b,c;实验三析构函数实验

27、三析构函数 1 1、实验目的、实验目的 通过实验理解析构函数的概念与其特殊应用。2 2、实验内容、实验内容 应用VC+6.0 的编辑环境构造一个类Student,该类重要实现学生的基本操作,该学生类包含学生姓名、学生学号、学生成绩(课程数目不定,其存储空间应动态申请),实现对该学生信息的初始化、求该学生的总成绩、平均成绩、最高分与最低分以及最后输出,具体说明如下:classStudent public:Student(char*n,char*s,intnum,double*s);Student();doubleGetSum();doubleGetAver();doubleGetMax();do

28、ubleGetMin();voidShow();private:char*name;/studentname char*stuno;/studentno intscore_num;/scorenumber double*score;/studentscore;实验四静态成员与友元实验四静态成员与友元 1 1、实验目的、实验目的(1)学习静态成员的使用,理解静态成员的特殊用途。(2)学习友元函数及友元类,领略友元类的作用。2 2、实验内容、实验内容 应用VC+6.0 的编辑环境构造一个类Stack,设计一个整数链表类,实现栈操作。类中需有记录结点个数的数据成员(静态成员),要有判空操作。编制应用

29、程序,取 100 次随机数(1000),假如取到的随机数比前一个随机数大的话,入栈,然后逐个取出(即出栈过程)求其和。用堆分派方法逐个产生满足条件(递增有序)的结点,插入栈中,每当出栈时,要及时将结点删除,求和工作放在类定义外(友元)。注意:栈中最多会有 100 个元素,最少会有一个元素,这是由条件(递增有序)决定的。具体说明如下:structSNode intdata;SNode*next;classStack public:Stack();Stack();voidPush(inte);/insertadataintostack intPop();/deleteadatafromstack

30、friendintGetSum(Stack&);/getsumofstack,friendfunction/friendclassgetsum;/getsumofstack,friendclass,youcantryitusingfriendclass staticintnum;/staticnumber private:SNode*head;对栈的入栈过程与出栈过程说明如下:(1)入栈,即向栈中添加一个元素,且该元素只能添加到当前链表最后一个数据元素之后,此时记录数组元素数据个数的变量应当进行+操作;(2)出栈,即从链表中删除一个数据元素,且该元素只能是当前栈中最后的一个元素,此时记录数据元

31、素个数的变量应当进行-操作,也就是说,入栈及出栈的操作标记事实上是由记录数组中数据元素个数的变量实现的。(3)判空,即判断当前栈(即链表)是否为空,也就是判断记录数组中数据元素个数的变量是否为 0。rand()函数与srand()函数的使用说明:rand/srand Generatesapseudorandom(伪随机的)number.intrand(void);intrand(void);Routine RequiredHeader Compatibility rand ANSI,Win95,WinNT voidsrand(unsignedintseed);voidsrand(unsigne

32、dintseed);ReturnValueReturnValue randrandreturnsapseudorandomnumber,asdescribedabove.Thereisnoerrorreturn.RemarksRemarks Therandrandfunctionreturnsapseudorandomintegerintherange0toRAND_MAXRAND_MAX.Usethesrandfunctiontoseedthepseudorandom-numbergeneratorbeforecallingrandrand.Thesrandsrandfunctionsets

33、thestartingpointforgeneratingaseriesofpseudorandomintegers.Toreinitializethegenerator,use1astheseedargument.Anyothervalueforseedsetsthegeneratortoarandomstartingpoint.randrandretrievesthepseudorandomnumbersthataregenerated.Callingrandrandbeforeanycalltosrandsrandgeneratesthesamesequenceascallings sr

34、andrandwithseedpassedas1.ExampleExample/*RAND.C:Thisprogramseedstherandom-numbergenerator*withthetime,thendisplays10randomintegers.*/#include#include#include voidmain(void)inti;/*Seedtherandom-numbergeneratorwithcurrenttimesothat*thenumberswillbedifferenteverytimewerun.*thenumberswillbedifferentever

35、ytimewerun.*/srand(unsigned)time(NULL);/*Display10numbers.*/for(i=0;i10;i+)printf(%6dn,rand();OutputOutput 6929 8026 21987 30734 20587 6699 22034 25051 7988 10104 实验五继承与多态性实验五继承与多态性 1 1、实验目的、实验目的 根据现有类建立新类;学习构造基类和虚函数的用法。2 2、实验内容、实验内容 应用VC+6.0 的编辑环境构造一个类Geometry及其派生类,该类重要实现关于几何图形的基本操作。对于基类“几何图形”,有求面积

36、、求体积的函数(纯虚函数),其派生类圆和矩形重要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。实验六运算符重载实验六运算符重载 1 1、实验目的、实验目的 理解运算符重载(非成员形式和成员形式)、学习重载几类运算符(+,=,!=,+,-,=等)。2 2、实验内容、实验内容 应用VC+6.0 的构建一个复数类Complex,试对下列几个运算符进行重载:+,=,!=,+,-,=,其中规定要有成员重载形式和友元重载形式,并且,+运算符规定实现先加和后加两种形式。该类定义原型说明:

37、CirclradiumCircle(Circle()BalBall(Ball(GeometrGeometry(Geometry(GetArea(GetPerimeter(Getcolume(show(Column Column()Column()RectanglRectangle(Rectangle(classcomplex public:complex(doubler=0,doublei=0);complex&operator+(complex&c);complexoperator-(complex&c);complexoperator*(complex&c);friendcomplexop

38、erator/(complex&c1,complex&c2);friendintoperator=(complex&c1,complex&c2);friendintoperator!=(complex&c1,complex&c2);/friendcomplexoperator+(complex&c);complexoperator+();voiddisp();private:doublereal;doubleimag;实验七动态链接库的制作与调用实验七动态链接库的制作与调用(多项式矩阵定义多项式矩阵定义)1 1、实验目的、实验目的 综合运用所学面向对象编程知识完毕动态链接库文献的创建、调用,理

39、解动态链接库的工作原理,体会声明和定义分开方法在程序设计中的优势,掌握运用动态链接库实现不同开发平台间混合编程的方法,掌握运用动态链接库实现代码可复用技术,进一步掌握混合开发的方法。2 2、实验内容、实验内容 综合应用所学面向对象编程知识定义一个多项式矩阵类并应用该类实现多项式矩阵类的运算。具体实现该矩阵的加法(采用运算符“+”重载)、转置(采用运算符“-”重载)及输出(采用运算符“”重载)操作。将该类制作为动态链接库,然后在其他工程中对该动态链接库进行调用。注:本次实验为四学时,其中前两个学时完毕下面实验指导中给出的一个动态链接库的制作实例,后面两个学时在前面示例的基础上自行设计多项式矩阵的

40、类的定义与使用。实验指导实验指导:先来阐述一下 DLL(DynamicLinkableLibrary)的概念,你可以简朴的把 DLL 当作一种仓库,它提供应你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库静态链接库动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,假如采用静态链接库,则无论你愿不乐意,lib中的指令都被直接包含在最终生成的 EXE 文献中了。但是若使用 DLL,该 DLL 不必被包含在最终EXE 文献中,EXE 文献执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文献。静态链接库和动态链接库的此外一个区别在于静态链接库中不能再包含其他

41、的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。对动态链接库,我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的 DLL 接口规范和调用方式,用各种语言编写的 DLL 都可以互相调用。譬如Windows 提供的系统 DLL(其中涉及了 Windows 的 API),在任何开发环境中都能被调用,不在乎其是 VisualBasic、VisualC+还是 Delphi。(2)动态链接库随处可见 我们在 Windows 目录下的 system32 文献夹中会看到 kernel32.dll、user32.dll 和 gdi32.dll,wi

42、ndows的大多数 API 都包含在这些 DLL 中。kernel32.dll 中的函数重要解决内存管理和进程调度;user32.dll中的函数重要控制用户界面;gdi32.dll 中的函数则负责图形方面的操作。一般的程序员都用过类似 MessageBox 的函数,其实它就包含在 user32.dll 这个动态链接库中。由此可见 DLL 对我们来说其实并不陌生。(3)VC 动态链接库的分类 VisualC+支持三种 DLL,它们分别是 Non-MFCDLL(非 MFC 动态库)、MFCRegularDLL(MFC规则 DLL)、MFCExtensionDLL(MFC 扩展 DLL)。非 MFC

43、 动态库不采用 MFC 类库结构,其导出函数为标准的 C 接口,能被非 MFC 或 MFC 编写的应用程序所调用;MFC 规则 DLL 包含一个继承自 CWinApp 的类,但其无消息循环;MFC 扩展DLL 采用 MFC 的动态链接版本创建,它只能被用 MFC 类库所编写的应用程序所调用。一个动态链接库的示例:一个动态链接库的示例:一方面我们做一个动态链接库提供 add 函数接口的方法,如图 1,在 VC+中 new 一个Win32Dynamic-LinkLibrary 工程 dllTest。注意不要选择 MFCAppWizard(dll)。图 1 建立一个非 MFCDLL 在建立的工程中添

44、加 lib.h 及 lib.cpp 文献,源代码如下:/*文献名:lib.h*/#ifndefLIB_H#defineLIB_H externCint_declspec(dllexport)add(intx,inty);#endif/*文献名:lib.cpp*/#includelib.h intadd(intx,inty)returnx+y;这两个文献建立结束后,执行“build”命令完毕动态链接库的编译与生成,此时,在该工程目录下的“debug”目录下则会生成 dllTest.dll 和 dllTest.lib 文献。然后,我们也建立一个与 DLL 工程处在同一工作区的应用工程 dllCal

45、l,将刚刚生成的两个文献将刚刚生成的两个文献拷贝到该共提成目录下拷贝到该共提成目录下,它调用 DLL 中的函数 add,其源代码如下:/一、动态调用动态链接库方式#include#include typedefint(*lpAddFun)(int,int);/宏定义函数指针类型 intmain(intargc,char*argv)HINSTANCEhDll;/DLL 句柄 lpAddFunaddFun;/函数指针 hDll=LoadLibrary(.DebugdllTest.dll);if(hDll!=NULL)addFun=(lpAddFun)GetProcAddress(hDll,add)

46、;if(addFun!=NULL)intresult=addFun(2,3);printf(%d,result);FreeLibrary(hDll);return0;分析上述代码,在 lib.h 对函数 add 的声明前面添加了_declspec(dllexport)语句。这个语句的含义是声明函数 add 为 DLL 的导出函数。DLL 内的函数分为两种:(1)DLL 导出函数,可供应用程序调用;(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。对下面语句进行逐个分析:一方面,语句 typedefint(*lpAddFun)(int,int)定义了一个与 add 函数接受

47、参数类型和返回值均相同的函数指针类型。随后,在 main 函数中定义了 lpAddFun 的实例 addFun;另一方面,在函数 main 中定义了一个 DLLHINSTANCE 句柄实例 hDll,通过 Win32Api 函数LoadLibrary 动态加载了 DLL 模块并将 DLL 模块句柄赋给了 hDll;再次,在函数 main 中通过 Win32Api 函数 GetProcAddress 得到了所加载 DLL 模块中函数 add 的地址并赋给了 addFun。经由函数指针 addFun 进行了对 DLL 中 add 函数的调用;最后,应用工程使用完 DLL 后,在函数 main 中通

48、过 Win32Api 函数 FreeLibrary 释放了已经加载的 DLL 模块。DLL 的调用方式的调用方式 在上面的例子中我们看到了由“LoadLibrary-GetProcAddress-FreeLibrary”系统 Api 提供的三位一体“DLL 加载-DLL 函数地址获取-DLL 释放”方式,这种调用方式称为 DLL 的动态调用。动态调用方式的特点是完全由编程者用 API 函数加载和卸载 DLL,程序员可以决定 DLL 文献何时加载或不加载,显式链接在运营时决定加载哪个 DLL 文献。静态调用方式的特点是由编译系统完毕对 DLL 的加载和应用程序结束时 DLL 的卸载。当调用某DL

49、L 的应用程序结束时,若系统中尚有其它程序使用该 DLL,则 Windows 对 DLL 的应用记录减 1,直到所有使用该 DLL 的程序都结束时才释放它。静态调用方式简朴实用,但不如动态调用方式灵活。下面我们来看看静态调用静态调用的例子,将编译将编译 dllTest 工程所生成的工程所生成的.lib 和和.dll 文献拷入文献拷入 dllCall 工程所工程所在的途径在的途径,dllCall 执行下列代码:/二、静态调用动态链接库方式#pragmacomment(lib,dllTest.lib)/.lib 文献中仅仅是关于其相应 DLL 文献中函数的复位位信息 externC_declspe

50、c(dllimport)add(intx,inty);intmain(intargc,char*argv)intresult=add(2,3);printf(%d,result);return0;由上述代码可以看出,静态调用方式的顺利进行需要完毕两个动作:(1)告诉编译器与 DLL 相相应的.lib 文献所在的途径及文献名,#pragmacomment(lib,dllTest.lib)就是起这个作用。程序员在建立一个 DLL 文献时,连接器会自动为其生成一个相应的.lib 文献,该文献包含了 DLL导出函数的符号名及序号(并不具有实际的代码)。在应用程序里,.lib 文献将作为 DLL 的替代

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 应用文书 > 技术指导

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服