第13章:链接库

上传人:博****1 文档编号:567964381 上传时间:2024-07-22 格式:PPT 页数:31 大小:274.02KB
返回 下载 相关 举报
第13章:链接库_第1页
第1页 / 共31页
第13章:链接库_第2页
第2页 / 共31页
第13章:链接库_第3页
第3页 / 共31页
第13章:链接库_第4页
第4页 / 共31页
第13章:链接库_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《第13章:链接库》由会员分享,可在线阅读,更多相关《第13章:链接库(31页珍藏版)》请在金锄头文库上搜索。

1、Visual C+Visual C+第三篇第三篇VCVC编程高级篇编程高级篇基于组件的编程与应用基于组件的编程与应用VC不仅能进行结构化的程序设计,还能进行面向对象的程序设计。基于组件的程序设计就是解决不同程序语言开发的程序差异而出现的一种程序设计方法。在VC程序中,不仅可以开发组件供自己或别的程序语言来调用,而且还可以使用别的程序语言开发的组件。 本篇主要讲解利用VC编制组件和调用组件的方法与原理,主要包括编制动态链接库和COM组件、调用VC自己开发的动态链接库和COM组件,以及结合数据库应用程序的开发,阐述了如何使用Microsoft的ADO数据访问组件来编写高效数据库客户端应用程序。 V

2、isual C+Visual C+第第1313章章动态链接库动态链接库13.1 动态链接库概述13.2 动态链接库的创建 13.3 动态链接库的显式调用 习题Visual C+Visual C+13.113.1 动态链接库概述动态链接库概述 动态链接库提供了一种代码共享机制,它可以有效地减小程序文件的尺寸和不必要的重复工作。本本章章以以一一个个包包含含递递归归分分形形树树函函数数的的. .DLLDLL的的建建立立为为例例,重重点点讲讲解解了了动动态态链链接接库库的的建建立立方方法法,在在VCVC中中显显式式调调用用. .DllDll的方法的方法。13.1.113.1.1 动态链接库定义动态链接

3、库定义 13.1.213.1.2 静态链接与动态链接静态链接与动态链接13.1.313.1.3 函数的导出与导入函数的导出与导入13.1.413.1.4 隐式链接与显式链接隐式链接与显式链接13.1.513.1.5 搜索动态链接库搜索动态链接库 *13.1.6*13.1.6使用动态链接库的优点使用动态链接库的优点Visual C+Visual C+13.1.113.1.1动态链接库定义动态链接库定义 动态链接库(Dynamic Link Library,简称DLL)是一个包含了若干函数的可执行模块,它实质上是一个函数包,Windows应用程序可以调用这些函数来完成实际的任务。DLL在Windo

4、ws环境中起着重要的作用Windows 利用 DLL来建立Windows应用程序可以使用的Windows函数与资源。动态链接库是一个文件,其中包含有函数或全局变量,使用他们就像应用程序使用自己定义的函数一样。用API开发Windows应用程序,实质就是调用Windows操作系统下的动态链接库。Visual C+Visual C+13.1.213.1.2静态链接与动态链接静态链接与动态链接 DLL与运行函数库(如C语言的运行函数库)类似,二二者者主主要要区别区别在于库代码的链接时机不同。 静态链接库在多任务环境中建立与运行时效率可能很低。一方面一方面,如果两个应用程序同时运行,且它们使用了同一个

5、静态库中的函数,那么就要求系统中出现该函数的两个副本,这显然降低了内存的使用效率。另一方面另一方面,对于比较复杂的问题,应用静态链接库将导致最终的应用程序长度超过系统内存而无法运行。 DLL DLL是在运行期间才被链接进来,该操作由是在运行期间才被链接进来,该操作由WindowsWindows操作系统自操作系统自身来完成,而运行函数库则是在程序链接期间由应用程序的链接器身来完成,而运行函数库则是在程序链接期间由应用程序的链接器如如LINK.EXELINK.EXE来完成,运行函数库的链接被称为来完成,运行函数库的链接被称为“静态链接静态链接”,它把,它把函数代码链接到应用程序中,增加了应用程序最

6、终执行代码的长度。函数代码链接到应用程序中,增加了应用程序最终执行代码的长度。它的主要优点是建立了一个应用程序可以利用的标准函数集,这样它的主要优点是建立了一个应用程序可以利用的标准函数集,这样在开发应用程序时就无需包含函数库中所包含的函数源代码。在开发应用程序时就无需包含函数库中所包含的函数源代码。 Visual C+Visual C+13.1.213.1.2静态链接与动态链接静态链接与动态链接 (续)(续)与静态链接库不同,动态链接库则允许若干个应用程序共享某个函数的单个副本。事实上,每个Windows API函数,如GetMesssage()、CreateWindow()和TextOut

7、()分别留于动态链接库 Kernel32.dll、User32.dll、Gdi32.dll之中。如果两个应用程序同时运行,且都使用了某个特定的Windows函数,那么它们将共享该函数代码的单个副本。DLL除了实现代码的共享外,还可以实现其它资源的共享,如数据和硬件资源的共享。Windows的设备驱动程序允许应用程序共享硬件资源,这些设备驱动程序就是以动态链接库的形式来出现。从某种程度上讲,动态链接库也是一种类型的计算机资源。一个动态链接库可以为多个应用程序使用,如果一个应用程序使用了某个动态链接库中函数,若库不存在,则调用将不能完成。 Visual C+Visual C+13.1.313.1.

8、3函数的导出与导入函数的导出与导入 动态链接库是一个.DLL文件 ,它存放在特定的位置上(13.1.5节讲)。程序员所创建的动态链接库中的函数要有导出标志,在使用动态链接库中的函数的程序中,要具有导入标志。 动态链接库中的函数并不是杂乱无章地堆放在一起,它们都有一个标志,即动态链接库中的导出标志。同样,如果应用程序要使用该库中的函数,也要向动态链接库发出“是否有我们想要的函数”,这通过导入标志来进行。双方必须达成一致后才能使用。Visual C+Visual C+13.1.313.1.3函数的导出与导入函数的导出与导入 (续)1通过扩展关键字dllexport 与dllimport 指定 从一

9、个动态链接库中导出一个函数可以通过如下的语句来完成 _declspec( dllexport ) void MyFunction(int i) /动态链接库中的函数MyFunction的实现代码 其中_declspec是一个扩展关键字,其作用和具有一个参数的函数类似,实际上,它与它的“参数”一起构成了一个“标志”,即“_declspec( dllexport) ”,该语句的含义为“出现在我后面的函数在当前的动态链接库文件中被合法导出,外部应用程序可以使用这个函数”。 从一个动态链接库中导入一个函数可以通过如下的语句来完成 _declspec( dllimpot ) void MyFunctio

10、n(int i); _declspec(dllimpot ) 的含义为“出现在我后面的函数MyFunction是从动态链接库文件中导入的函数”。Visual C+Visual C+13.1.313.1.3函数的导出与导入函数的导出与导入 (续)2通过DEF文件指定 动态链接库DLL是通过导出函数和变量来实现代码共享的,外部程序能通过这个导出过程来访问内部的函数和变量。 在VC下,除了使用编译指令dllexport 与dllimport 实现导出、导入函数的指定外,还可以通过DLL工程中的DEF文件来实现,利用应用程序向导生成的动态链接库中有一个和工程名同名的一个.def文件,例如建立一个在my

11、dll.dll的动态链接库,则生成的mydll.def的主要内容如下:(1) Def的内容; ; mydllmydll.def : Declares the module parameters for the DLL.def : Declares the module parameters for the DLL.LIBRARY LIBRARY mydllmydll DESCRIPTION DESCRIPTION mydllmydll Windows Dynamic Link Library Windows Dynamic Link LibraryEXPORTSEXPORTS; Explici

12、t exports can go here; Explicit exports can go here;以下为用户手工填写的代码,它代表导出的函数名为DrawTree DrawTreeVisual C+Visual C+13.1.313.1.3函数的导出与导入函数的导出与导入 (续)(2) Def的内容说明 AppWizard生成的mydll.def文件包含了关于DLL在Windows下运行的一些信息。在这个文件中定义了一些参数,包括DLL的名称和属性,还声明了从DLL中输出的函数。动态链接库的DEF文件中的注释行标志符和.cpp文件不一样,它用分号“;”表示,而不是用双斜线“/”表示。 第一

13、行语句:第一行语句: LIBRARY LIBRARY mydllmydll 表示要建立的动态链接库文件的名称为“myDll”,加在语句EXPORT后面的代码DrawTree表示可以被其它应用程序调用的函数。语句EXPORT表示其后面的函数都可以被与该动态链接库链接的EXE应用程序调用。Visual C+Visual C+13.1.413.1.4隐式链接与显式链接隐式链接与显式链接1隐式链接 若在代码中没有明确指定应用程序要装入的动态链接库,但却使用其中的某个函数,这种链接的方式称为隐式链接。 利用VC可以编写各种DLL程序,其最终目的是在应用程序中调用DLL。链接DLL到可执行程序有两种方式两

14、种方式:隐式链接(Implicit linking )显式链接(Explicit linking)Visual C+Visual C+13.1.413.1.4隐式链接与显式链接隐式链接与显式链接 (续)2显式链接 显 示 链 接 , 又又 称称 显显 式式 调调 用用 , 是 由 编 程 者 用 API函 数 LoadLibrary()加载DLL、并通过GetProcessAddress()来获取应用程序要调用的导出函数指针来调用DLL的导出函数,最后通过FreeLibrary()卸载DLL。它是一种动态调用的方式,通过它能够有效地使用内存,是编制大型应用程序的重要方式。Visual C+Vi

15、sual C+13.1.513.1.5搜索动态链接库搜索动态链接库 在隐式调用的应用程序运行时,需要寻找它所用的动态链接库,并且把它们加载到进程的虚拟地址空间内,为了使应用程序正常地使用动态链接库,必须将.DLL文件存放在下列任何一个子目录中,Windows操作系统也是按照下列顺序来搜索动态链接库的: (1)程序所在的当前目录(包含EXE可执行文件的目 录); (2)进程的当前工作目录; (3)Windows系统目录(如C:WindowsSystem子目录); (4)Windows目录(如C:Windows子目录); (5)在Path环境变量中列出的一系列目录。 Visual C+Visual

16、 C+*13.1.6*13.1.6使用动态链接库的优点使用动态链接库的优点 动态链接库非常有利于软件的编写和更新,在编写程序时,可以把一个大型软件项目分割为多个单独模块,在这些模块中定义好它们的调用关系,然后分别由多个程序员进行编写。在各个模块内,程序员可以充分发挥他们的创造性,优化程序代码。而且,利用动态链接库对于软件的更新也是非常有好处的。在更新或者升级这个软件时,可以只更新这个软件的动态链接库。现代应用程序广泛地使用动态链接库,其好处好处是:(1 1)同时运行的多个应用程序可以同时使用同一个动态链接库,它们在内存中只是共享DLL文件的一个拷贝。(2 2)只要编写的应用程序函数、变量和返回

17、值的类型和数量不发生变化,动态链接库中的函数可以不用重新编译链接而且直接使用,这一点明显优于静态链接;(3 3)只要遵循一定的规则,不同语言编写的应用程序可以调用同一个动态链接库,而不管这个函数执行什么操作;(4 4)在设计应用程序时,将其拆分成功能相互独立的部件.DLL,为以后对这些功能部件各自升级提供较方便的途径;(5 5)使资源数据独立于可执行程序之外,但又能较方便快速地访问它。 Visual C+Visual C+13.213.2 动态链接库的创建动态链接库的创建 13.2.1 13.2.1 动态链接库的分类动态链接库的分类13.2.2 13.2.2 DLLDLL工作原理工作原理 13

18、.2.3 13.2.3 实现递归分形树的实现递归分形树的DllDllVisual C+Visual C+13.2.113.2.1动态链接库的分类动态链接库的分类利用VC的应用程序向导生成动态链接库程序的框架的方法是:在VC开发环境下,选择File|New|Projects|MFC AppWizard(Dll),在Project Name编辑框中输入一个工程名后,单击OK按钮就会出现图13.1所示的选择动态链接库类型的对话框。VC向导可以创建三三种种类型的动态链接库类型的动态链接库。1普通静态链接MFC的DLL 普通静态链接MFC的DLL就是图图13.113.1的第一种类型(Regular DL

19、L With MFC static linked)。该种形式的DLL可以被任何Win32的应用程序(不论是使用API开发的,还是使用MFC开发的)调用,但它不能与动态MFC链接。在该种DLL中,可以使用MFC类库,但使用的方式是静态链接。Visual C+Visual C+13.2.113.2.1动态链接库的类动态链接库的类 (续) 2普通动态链接MFC的DLL 普通动态链接MFC的DLL就是图图13.113.1的第二种类型(Regular DLL using shared MFC DLL)。和第一种DLL相似,都可被任何Win32的应用程序(API开发的或使用MFC开发的)调用,只不过第一种

20、DLL的函数是与MFC静态链接,而第二种DLL中的函数是与MFC动态链接。3扩展的DLL 扩展的DLL就是图图13.113.1中的第三种类型(MFC Extension Dll using shared MFC DLL)。该类DLL只能被使用MFC动态链接的MFC应用程序(即有一个CWinApp的派生类对象)调用,而不能被非MFC应用程序调用,并且在该DLL中不仅可以导出函数和变量,而且还可以导出整个类。 Visual C+Visual C+图图13.1 13.1 三种形式的动态链接库选择框三种形式的动态链接库选择框到13.2.3Visual C+Visual C+13.2.113.2.1动态

21、链接库的分类动态链接库的分类 (续) 在上述三种类型的动态链接库中都可以使用MFC,如果不想在DLL中使用MFC,可以采用VC生成的第四种动态链接库。 4Win32 Application DLL 在VC开发环境下,选择File|New|Projects|Win32 Dynamic-Linked Library,在Project Name编辑框中输入一个工程名后,单击OK按钮就会出现选择DLL的对话框,选择第三个选项后,按“Finish”按钮,就生成了动态链接库的框架。 该种DLL是最基础的DLL,简单来说,前面三种DLL都可以由这种方法来构建,它所包含的VC头文件最少,可以生成最为简练的DL

22、L。Visual C+Visual C+13.2.213.2.2DLLDLL工作原理工作原理 对于动态链接库而言,会有许多进程同时共享它的代码,所以Windows子系统会把它们装入内存映射文件。在应用程序打开动态链接库时,就把动态链接库的执行代码映射到使用它的每个进程地址空间中。当应用程序调用动态链接库时,系统首先会为这个动态链接库建立一个文件映射对象,然后搜索调用者的地址空间,为这个动态链接库寻找空间,将文件映射到进程的地址空间中。随后,操作系统检查调用者和动态链接库的引用表,并把为每个DLL函数所分配的虚地址插入到调用者的输入库中。多个进程调用相同的动态链接库时,这个动态链接库会被映射到不

23、同的虚地址。当一个进程装入一个动态链接库时,系统把动态链接库中的数据和代码映射到进程的地址空间中。动态链接库中的任何内存分配都是从进程的地址空间中分配的,而任何其它进程都不能访问这块内存,每个进程都有一套属于它自己的动态链接库的全局和静态变量。Visual C+Visual C+13.2.313.2.3实现递归分形树的实现递归分形树的DllDll 【例13-1】创建一个mydll动态链接库,在其中编写一个函数DrawTree(),实现一个递归分形树。该DLL为第二种DLL,即图图13.113.1中的选择。1生成mydll.dll的框架 在VC开发环境下,选择File|New|Projects|

24、MFC AppWizard(Dll),在Project Name编辑框中输入工程名mydll后,单击OK按钮就会出现图图13.113.1所示的选择动态链接库类型的对话框,我们选择第二种类型,因为该种类型的DLL使用MFC库中的函数是共享方式,节省空间。完后,单击“Finish”按钮生成mydll工程的框架。2在mydll.h文件添加动态链接库的函数原型声明 打开mydll.h文件,在应用程序类CMydllApp前添加 DrawTree()函数原型声明,该函数完成创建一个递归分形树。 / DrawTree为用户添加的函数原型声明,靠该函数创建一个递归分形树 int int DrawTreeDra

25、wTree( (CPaintDCCPaintDC *dc,*dc,int int xStartxStart, ,int int yStartyStart,double ,double length,double angle,length,double angle,intint num); num);Visual C+Visual C+13.2.313.2.3实现递归分形树的实现递归分形树的DllDll (续)3在mydll.cpp文件添加动态链接库的函数实现 打开mydll.cpp文件,在应用程序类对象theApp前添加 DrawTree() 函数的定义,该函数完成具体创建一个递归分形树的方法

26、。 CMydllApp theAppCMydllApp theApp; ;/下面为用户添加的代码,它创建一个递归分形树的函数下面为用户添加的代码,它创建一个递归分形树的函数DrawTreeDrawTree()()的实现的实现int int DrawTreeDrawTree( (CPaintDCCPaintDC *dc, *dc, int int xStartxStart, , int int yStartyStart, , double double length, length, double angle, double angle, intint num) num)/*dc/*dc显显示示

27、设设备备描描述述表表句句柄柄, , xStartxStart, ,yStart yStart 树树枝枝或或树树干干的的起起始始点点位位置置 , , lengthlength为为树枝或树干的长度树枝或树干的长度, , angleangle树枝或树干的倾斜角度树枝或树干的倾斜角度, , num num 递归层次数递归层次数)*/)*/ /具体定义见书本具体定义见书本 4在mydll.def导出DrawTree函数下面为mydll.def的内容。; mydll.def : Declares the module parameters for the DLL.Visual C+Visual C+13.

28、2.313.2.3实现递归分形树的实现递归分形树的DllDll (续) 下面为mydll.def的内容。 ; ; mydllmydll.def : Declares the module parameters for the DLL.def : Declares the module parameters for the DLL. LIBRARY LIBRARY mydllmydll“ DESCRIPTION DESCRIPTION mydllmydll Windows Dynamic Link Library Windows Dynamic Link Library EXPORTS EXPO

29、RTS ; Explicit exports can go here ; Explicit exports can go here ;以下为用户手工填写的代码 DrawTreeDrawTree 该文件的内容说明请参见13.1.3。 注注意意:在选择Build/Build mydll.dll菜单命令前,必须先逐个编译两个.cpp文件:StdAfx.cpp,mydll.cpp。 Visual C+Visual C+13.313.3 动态链接库的显式调用动态链接库的显式调用 13.3.1 装入动态链接库13.3.2 取得函数地址13.3.3 调用动态链接库的实例 Visual C+Visual C+

30、13.3.113.3.1装入动态链接库装入动态链接库在显式使用动态链接库之前,必须先把动态链接库装入内存,该操作主要靠函数LoadLibrary()来实现。下面是该函数的原型说明。 HMODULE HMODULE LoadLibraryLoadLibrary( ( LPCTSTR LPCTSTR lpFileName lpFileName / / 动态链接库文件的名称动态链接库文件的名称 ); ); 当应用程序试图把lpFileName所指向的动态链接库装入内存时,会先从系统中查找,如果这个动态链接库已经在在内内存存中,则系统会增加这个动态链接库的使用计数,并返回这个动态链接库的句柄。如果不不

31、在在内内存存中,则系统会先查找该文件,如果没有文件的路径,则在当前目录或在系统目录中查找,并把该文件装入内存,最后返回该动态链接库的句柄。 Visual C+Visual C+13.3.213.3.2取得函数地址取得函数地址 一个动态链接库中可以包含多个导出函数,当通过调用LoadLibraryLoadLibrary()()取得指定动态链接库模块的句柄,要想使用该模块中的某个函数,首先必须取通过GetProcAddress取得该函数的地址。 FARPROC FARPROC GetProcAddressGetProcAddress( ( HMODULE HMODULE hModulehModul

32、e, /, /动态链接库的句柄动态链接库的句柄 LPCSTR LPCSTR lpProcName lpProcName /导出函数的名称导出函数的名称 ); ); 该函数将hModule所指的动态链接库中的lpProcName所指定的函数装入内存。当取得函数的地址后,就可以使用该函数,使用完后,调用FreeLibraryFreeLibrary()()释放动态链接库。 Visual C+Visual C+13.3.313.3.3调用动态链接库的实例调用动态链接库的实例 【例13-2】创建一个MFC应用程序,使用显式调用的方式调用前面创建的动态链接库mydll.dll中的函数DrawTree(),

33、在客户区显示一个递归分形树。 1 1生成生成SDISDI工程程序工程程序TestDllTestDll 用AppWizard创建一个单文档的应用程序,工程名为“TestDll” 2 2增加消息映射函数增加消息映射函数OnPaintOnPaint()() 利 用 类 向 导 ClassWizard添 加 对 WM_PAINT消 息 的 响 应 函 数OnmPaint(),定位到该函数的实现处,添加如下的代码:添加如下的代码: Visual C+Visual C+ void void CTestDllViewCTestDllView:OnPaintOnPaint() () CPaintDCCPain

34、tDC dc(this); / device context for painting dc(this); / device context for painting /*/*声声明明一一个个DRAWTREEDRAWTREE的的变变量量类类型型,存存放放一一个个函函数数的的地地址址,该该函函数数无无参参数数,返返回值为整数回值为整数*/*/ typedef typedef intint(*DRAWTREE)(*DRAWTREE)(CPaintDCCPaintDC * * , ,intint , , intint , , double double , , double double , , i

35、ntint ); ); /声声明明一一个个类类型型为为DRAWTREEDRAWTREE的的一一个个变变量量DrawTreeDrawTree,它它存存放放一一个个无无参参数数,返返回值为整数的函数的指针回值为整数的函数的指针DRAWTREE DRAWTREE DrawTreeDrawTree; ;CRect rectCRect rect; ;GetClientRectGetClientRect( (rectrect); /); /取得客户区的大小取得客户区的大小 FARPROC FARPROC lpfnlpfn=NULL;=NULL;HINSTANCE HINSTANCE hinsthinst=

36、NULL;=NULL; /声声明明类类型型为为HINSTANCEHINSTANCE的的变变量量hinsthinst, ,它它存存放放动动态态链链接接库库的的句句柄柄。初初始始值值为为NULL NULL hinsthinst= =LoadLibraryLoadLibrary(e:(e:vcppvcppmydllmydlldebugdebugmydllmydll. .dlldll);); / /动态加载刚才创建的动态链接库动态加载刚才创建的动态链接库mydllmydll if(if(hinsthinst=NULL) =NULL) AfxMessageBoxAfxMessageBox(“(“不能加载

37、动态连接库不能加载动态连接库”); ”); return; return; 程程序序Visual C+Visual C+ lpfnlpfn= =GetProcAddressGetProcAddress( (hinsthinst,DrawTreeDrawTree);/);/取取得得动动态态链链接接库库mydllmydll中中的的函数函数DrawTreeDrawTree的地址的地址DrawTreeDrawTree=(DRAWTREE)=(DRAWTREE)lpfnlpfn; ; dc. dc.SetMapModeSetMapMode(MM_LOENGLISH); /(MM_LOENGLISH);

38、/设置映射模式设置映射模式 if (if (lpfnlpfn=NULL) =NULL) AfxMessageBoxAfxMessageBox(不能加载画树函数不能加载画树函数););else else DrawTreeDrawTree(&dc,rect.right/2,-(&dc,rect.right/2,-rect.bottom*9/10,(double)rect.bottom*0.2,1.57,9); rect.bottom*9/10,(double)rect.bottom*0.2,1.57,9); /调用动态链接库调用动态链接库mydllmydll中的函数中的函数DrawTreeDraw

39、Tree画一棵分形树画一棵分形树 if(if(hinsthinst=NULL) =NULL) AfxMessageBoxAfxMessageBox(“(“不不能能加加载载动动态态连连接接库库”); ”); return; return; lpfnlpfn= =GetProcAddressGetProcAddress( (hinsthinst,DrawTreeDrawTree);/);/取取得得动动态态链链接接库库mydllmydll中中的的函数函数DrawTreeDrawTree的地址的地址DrawTreeDrawTree=(DRAWTREE)=(DRAWTREE)lpfnlpfn; ;dc.

40、dc.SetMapModeSetMapMode(MM_LOENGLISH); /(MM_LOENGLISH); /设置映射模式设置映射模式 if (if (lpfnlpfn=NULL) =NULL) AfxMessageBoxAfxMessageBox(不能加载画树函数不能加载画树函数););else else DrawTreeDrawTree(&dc,rect.right/2,-(&dc,rect.right/2,-rect.bottom*9/10,(double)rect.bottom*0.2,1.57,9); rect.bottom*9/10,(double)rect.bottom*0.

41、2,1.57,9); /调用动态链接库调用动态链接库mydllmydll中的函数中的函数DrawTreeDrawTree画一棵分形树画一棵分形树 程程序序(续续)Visual C+Visual C+13.3.313.3.3调用动态链接库的实例(调用动态链接库的实例(续)3 3程序运行结果程序运行结果 编译、链接并运行该程序,屏幕显示的画面如图图13.213.2所示。图13.2 分形树图形Visual C+Visual C+习题习题一、名词解释:一、名词解释:1动态链接2递归3导出二、简单题:二、简单题: 1什么是动态链接库,它和静态链接库有何区别? 2显式使用动态链接库的步骤是什么?每一步需要使用哪些函数来完成? 3要想隐式调用动态链接库,必须把该库放到Windows所能够搜索到的目录中,请问,这些库文件可以存放到哪些目录中?三、实验题:三、实验题: 1建立一个动态链接库,在该库中包含两个函数,一个是本章所讲的显示递归分形树,另一个是显示一个余弦曲线。 2在上述程序基础上,编写一个MFC应用程序,单击鼠标左键时,调用显示递归分形树的函数,单击鼠标右键时,调用显示余弦曲线的函数。完后上机调试。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号