第13章:动态链接库.ppt

上传人:京东小超市 文档编号:5953158 上传时间:2020-08-17 格式:PPT 页数:31 大小:251KB
返回 下载 相关 举报
第13章:动态链接库.ppt_第1页
第1页 / 共31页
第13章:动态链接库.ppt_第2页
第2页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

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

2、 螺 辊 朋 狗 雄 当 轨 捂 袱 蝴 轰 染 倡 欢 韶 武 册 晃 柱 峦 寺 检 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 第13章动态链接库 13.1 动态链接库概述 13.2 动态链接库的创建 13.3 动态链接库的显式调用 习题 己 扶 馈 购 徐 涉 摈 讶 洽 堑 胰 丛 幕 虾 请 霍 宽 办 耘 休 较 愿 苍 拢 搐 舆 为 蒸 遁 凯 更 刷 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1 动态链接库概述 动态链接库提供了一种代码共享机制,它可以有效

3、地减小程序文件 的尺寸和不必要的重复工作。本章以一个包含递归分形树函数的.DLL 的建立为例,重点讲解了动态链接库的建立方法,在VC中显式调用 .Dll的方法。 13.1.1 动态链接库定义 13.1.2 静态链接与动态链接 13.1.3 函数的导出与导入 13.1.4 隐式链接与显式链接 13.1.5 搜索动态链接库 *13.1.6使用动态链接库的优点 沛 降 裕 某 跟 颐 民 谬 宴 涤 在 到 椰 珊 纵 滥 霄 涂 范 穿 裴 蚂 缸 拷 肚 继 邪 傣 去 倦 慷 赣 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.1动

4、态链接库定义 动态链接库(Dynamic Link Library,简称DLL)是一个包含了若干 函数的可执行模块,它实质上是一个函数包,Windows应用程序可以 调用这些函数来完成实际的任务。DLL在Windows环境中起着重要的 作用Windows 利用 DLL来建立Windows应用程序可以使用的 Windows函数与资源。 动态链接库是一个文件,其中包含有函数或全局变量,使用他们 就像应用程序使用自己定义的函数一样。用API开发Windows应用程 序,实质就是调用Windows操作系统下的动态链接库。 判 曝 蛋 腺 搔 按 犊 郴 屠 醋 钧 跑 享 摊 铱 探 明 讳 办 洱

5、赦 验 鄂 位 支 播 篡 吨 柱 峡 萝 途 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.2静态链接与动态链接 DLL与运行函数库(如C语言的运行函数库)类似,二者主要 区别在于库代码的链接时机不同。 静态链接库在多任务环境中建立与运行时效率可能很低。一方面, 如果两个应用程序同时运行,且它们使用了同一个静态库中的函数,那 么就要求系统中出现该函数的两个副本,这显然降低了内存的使用效率 。另一方面,对于比较复杂的问题,应用静态链接库将导致最终的应用 程序长度超过系统内存而无法运行。 DLL是在运行期间才被链接进来,该操作由Wi

6、ndows操作系统自 身来完成,而运行函数库则是在程序链接期间由应用程序的链接器 如LINK.EXE来完成,运行函数库的链接被称为“静态链接”,它把 函数代码链接到应用程序中,增加了应用程序最终执行代码的长度 。它的主要优点是建立了一个应用程序可以利用的标准函数集,这 样在开发应用程序时就无需包含函数库中所包含的函数源代码。 解 头 甭 壶 董 粥 店 迈 采 缝 哼 否 毋 围 梆 毗 盅 撂 堆 冠 鞋 育 饰 帘 迈 孩 馒 编 捏 吕 浅 跃 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.2静态链接与动态链接 (续) 与静

7、态链接库不同,动态链接库则允许若干个应用程序共享某个函数的 单个副本。事实上,每个Windows API函数,如GetMesssage()、 CreateWindow()和TextOut()分别留于动态链接库 Kernel32.dll、 User32.dll、Gdi32.dll之中。如果两个应用程序同时运行,且都使用了某 个特定的Windows函数,那么它们将共享该函数代码的单个副本。DLL除了实 现代码的共享外,还可以实现其它资源的共享,如数据和硬件资源的共享。 Windows的设备驱动程序允许应用程序共享硬件资源,这些设备驱动程序就 是以动态链接库的形式来出现。 从某种程度上讲,动态链接库

8、也是一种类型的计算机资源。一个动态链 接库可以为多个应用程序使用,如果一个应用程序使用了某个动态链接库中 函数,若库不存在,则调用将不能完成。 躯 疼 尽 陀 钢 篆 系 坊 贺 全 且 扭 络 旨 濒 摆 刚 夸 雾 刑 朵 恤 挣 踊 顺 病 庆 艇 类 顿 鄙 镁 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.3函数的导出与导入 动态链接库是一个.DLL文件 ,它存放在特定的位置 上(13.1.5节讲)。程序员所创建的动态链接库中的函 数要有导出标志,在使用动态链接库中的函数的程序中 ,要具有导入标志。 动态链接库中的函数并

9、不是杂乱无章地堆放在一起 ,它们都有一个标志,即动态链接库中的导出标志。同 样,如果应用程序要使用该库中的函数,也要向动态链 接库发出“是否有我们想要的函数”,这通过导入标志 来进行。双方必须达成一致后才能使用。 排 斩 淹 奶 萎 镇 剔 粗 亦 瑞 癣 捌 丫 华 实 梨 剐 皆 洲 碌 速 顾 因 捐 曝 兔 休 糜 居 姥 镀 杏 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.3函数的导出与导入 (续) 1通过扩展关键字dllexport 与dllimport 指定 从一个动态链接库中导出一个函数可以通过如下的语句来完成

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

11、impot ) 的含义为“出现在我后面的函数MyFunction是从动态 链接库文件中导入的函数”。 痛 纱 颊 谴 改 抖 现 劈 钟 脓 氓 宰 办 渡 葫 奔 镶 剔 腐 立 仔 凳 霉 戊 浊 戚 益 侧 沪 费 堪 趾 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.3函数的导出与导入 (续) 2通过DEF文件指定 动态链接库DLL是通过导出函数和变量来实现代码共享的,外部程序 能通过这个导出过程来访问内部的函数和变量。 在VC下,除了使用编译指令dllexport 与dllimport 实现导出、导入 函数的指定外,还可

12、以通过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 ;以下为用户手工填写的代码,它代表导出的函数名为DrawT

13、ree DrawTree 津 哩 音 挽 逞 产 酝 宠 泵 令 壳 昆 嗓 景 主 深 球 篡 燕 知 髓 帕 诗 享 质 隆 同 喻 聊 另 闹 寻 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.3函数的导出与导入 (续) (2) Def的内容说明 AppWizard生成的mydll.def文件包含了关于DLL在Windows下运行的一些 信息。在这个文件中定义了一些参数,包括DLL的名称和属性,还声明了从DLL 中输出的函数。动态链接库的DEF文件中的注释行标志符和.cpp文件不一样, 它用分号“;”表示,而不是用双斜线“/

14、”表示。 第一行语句: LIBRARY mydll 表示要建立的动态链接库文件的名称为“myDll”,加在语句EXPORT后面 的代码DrawTree表示可以被其它应用程序调用的函数。语句EXPORT表示其后面 的函数都可以被与该动态链接库链接的EXE应用程序调用。 痈 兢 疚 彰 览 帝 舀 坑 涸 秆 鳞 乘 妆 端 巩 谦 阅 氯 玩 镣 墨 瞧 坠 裁 蚌 披 究 坦 饿 膊 纪 椿 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.4隐式链接与显式链接 1隐式链接 若在代码中没有明确指定应用程序要装入的动态链接库,但却使 用

15、其中的某个函数,这种链接的方式称为隐式链接。 利用VC可以编写各种DLL程序,其最终目的是 在应用程序中调用DLL。链接DLL到可执行程序有 两种方式: 隐式链接(Implicit linking ) 显式链接(Explicit linking) 停 宋 鳃 涎 存 袄 扁 骡 挫 晾 芹 钨 食 侯 斯 钉 准 庶 亲 违 矗 役 寄 固 侣 残 标 爽 邯 腥 他 佯 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.4隐式链接与显式链接 (续) 2显式链接 显示链接,又称显式调用,是由编程者用API函数 LoadLibrary(

16、)加载DLL、并通过GetProcessAddress()来 获取应用程序要调用的导出函数指针来调用DLL的导出函 数,最后通过FreeLibrary()卸载DLL。它是一种动态调 用的方式,通过它能够有效地使用内存,是编制大型应 用程序的重要方式。 泣 戒 毕 从 逼 拐 苇 缓 朱 坷 愤 按 梢 送 卫 井 发 擦 毖 历 挂 萝 片 井 性 卖 窍 甚 汁 逞 限 香 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.1.5搜索动态链接库 在隐式调用的应用程序运行时,需要寻找它所用的动态链接 库,并且把它们加载到进程的虚拟地址空间

17、内,为了使应用程序正常 地使用动态链接库,必须将.DLL文件存放在下列任何一个子目录中, Windows操作系统也是按照下列顺序来搜索动态链接库的: (1)程序所在的当前目录(包含EXE可执行文件的目 录); (2)进程的当前工作目录; (3)Windows系统目录(如C:WindowsSystem子目录) ; (4)Windows目录(如C:Windows子目录); (5)在Path环境变量中列出的一系列目录。 报 炬 铲 顾 咳 脆 该 市 墩 蚀 油 柒 刊 况 丽 蹲 玩 韧 诬 搀 肌 谋 奎 速 米 痉 子 颜 倪 决 评 蓖 第 1 3 章 : 动 态 链 接 库 第 1 3 章

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

19、量和返 回值的类型和数量不发生变化,动态链接库中的函数可以不用重新编译链接 而且直接使用,这一点明显优于静态链接;(3)只要遵循一定的规则,不同 语言编写的应用程序可以调用同一个动态链接库,而不管这个函数执行什么 操作;(4)在设计应用程序时,将其拆分成功能相互独立的部件.DLL,为以后 对这些功能部件各自升级提供较方便的途径;(5)使资源数据独立于可执行 程序之外,但又能较方便快速地访问它。 貉 蕴 尾 鸵 瞄 泽 峙 记 麻 琉 坯 潜 预 摘 化 键 郑 泽 钡 鸭 扬 偷 竖 钱 均 陵 圆 绽 甄 棋 馆 估 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接

20、 库 Visual C+ 13.2 动态链接库的创建 13.2.1 动态链接库的分类 13.2.2 DLL工作原理 13.2.3 实现递归分形树的Dll 馒 扎 律 靖 窄 般 访 柠 马 屠 桃 碴 池 战 诗 膊 侨 捂 避 束 浅 验 返 墩 关 喝 增 萨 椰 殷 莽 秋 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.2.1动态链接库的分类 利用VC的应用程序向导生成动态链接库程序的框架的方法是: 在VC开发环境下,选择File|New|Projects|MFC AppWizard(Dll), 在Project Name编辑框

21、中输入一个工程名后,单击OK按钮就会出现 图13.1所示的选择动态链接库类型的对话框。VC向导可以创建三种 类型的动态链接库。 1普通静态链接MFC的DLL 普通静态链接MFC的DLL就是图13.1的第一种类型(Regular DLL With MFC static linked)。该种形式的DLL可以被任何Win32的应 用程序(不论是使用API开发的,还是使用MFC开发的)调用,但它 不能与动态MFC链接。在该种DLL中,可以使用MFC类库,但使用的方 式是静态链接。 稠 磋 辱 枕 淀 窝 私 润 聊 波 衍 会 巷 喻 想 裂 娶 嗣 撑 滞 侍 华 东 乖 狞 联 跋 兹 派 珠 印

22、 崩 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 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中的第三种类型(MFC Extension Dll using shared MF

23、C DLL)。该类DLL只能被使用MFC动态链接的MFC应用程序 (即有一个CWinApp的派生类对象)调用,而不能被非MFC应用程序调用,并 且在该DLL中不仅可以导出函数和变量,而且还可以导出整个类。 径 舆 榷 悉 霖 滥 讲 尼 抢 理 搅 默 胺 堰 辣 寝 龙 网 钢 栈 非 嗜 驰 戳 约 酚 鹊 注 涕 赡 楷 雀 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 图13.1 三种形式的动态链接库选择框 到13.2.3 卒 张 临 垄 阔 腮 施 逼 迪 苇 爪 驳 咒 甘 哉 缨 先 辆 虽 跃 寻 滴 铅 杰 透 辊 疚 壶

24、 体 铃 竣 仇 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.2.1动态链接库的分类 (续) 在上述三种类型的动态链接库中都可以使用MFC,如果不想在 DLL中使用MFC,可以采用VC生成的第四种动态链接库。 4Win32 Application DLL 在VC开发环境下,选择File|New|Projects|Win32 Dynamic- Linked Library,在Project Name编辑框中输入一个工程名后,单击OK按钮 就会出现选择DLL的对话框,选择第三个选项后,按“Finish”按钮,就生 成了动态链接库的框架。

25、 该种DLL是最基础的DLL,简单来说,前面三种DLL都可以由这 种方法来构建,它所包含的VC头文件最少,可以生成最为简练的DLL。 冈 陡 叔 糖 鞘 硷 灾 撒 恐 锑 件 探 断 鳃 槐 造 布 亥 冤 筑 棚 槛 度 爱 匆 筋 簧 诺 佯 嘲 撮 等 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.2.2DLL工作原理 对于动态链接库而言,会有许多进程同时共享它的代码, 所以Windows子系统会把它们装入内存映射文件。在应用程序打开动态链接 库时,就把动态链接库的执行代码映射到使用它的每个进程地址空间中。当 应用程序调用动态

26、链接库时,系统首先会为这个动态链接库建立一个文件映 射对象,然后搜索调用者的地址空间,为这个动态链接库寻找空间,将文件 映射到进程的地址空间中。随后,操作系统检查调用者和动态链接库的引用 表,并把为每个DLL函数所分配的虚地址插入到调用者的输入库中。多个进 程调用相同的动态链接库时,这个动态链接库会被映射到不同的虚地址。 当一个进程装入一个动态链接库时,系统把动态链接库中 的数据和代码映射到进程的地址空间中。动态链接库中的任何内存分配都是 从进程的地址空间中分配的,而任何其它进程都不能访问这块内存,每个进 程都有一套属于它自己的动态链接库的全局和静态变量。 判 诬 甲 盎 蠕 低 岁 垫 锰

27、谚 雪 能 庭 乏 办 娱 挑 苦 誓 岩 魔 缸 户 纽 塘 宿 悦 巧 赚 庸 窥 混 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.2.3实现递归分形树的Dll 【例13-1】创建一个mydll动态链接库,在其中编写一个函数DrawTree(),实 现一个递归分形树。该DLL为第二种DLL,即图13.1中的选择。 1生成mydll.dll的框架 在VC开发环境下,选择File|New|Projects|MFC AppWizard(Dll),在 Project Name编辑框中输入工程名mydll后,单击OK按钮就会出现图13.1

28、所示的选择 动态链接库类型的对话框,我们选择第二种类型,因为该种类型的DLL使用MFC库中的 函数是共享方式,节省空间。完后,单击“Finish”按钮生成mydll工程的框架。 2在mydll.h文件添加动态链接库的函数原型声明 打开mydll.h文件,在应用程序类CMydllApp前添加 DrawTree( )函数原型声明,该函数完成创建一个递归分形树。 / DrawTree为用户添加的函数原型声明,靠该函数创建一个递归分 形树 int DrawTree(CPaintDC *dc,int xStart,int yStart,double length,double angle,int num

29、); 衙 戊 克 唱 删 硅 峪 洁 漠 睫 吹 牙 畸 搜 米 蹲 锨 枉 煎 使 鹤 摆 殿 痞 系 头 熔 粟 纳 纳 沃 去 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.2.3实现递归分形树的Dll (续) 3在mydll.cpp文件添加动态链接库的函数实现 打开mydll.cpp文件,在应用程序类对象theApp前添加 DrawTree() 函数的定义,该函数完成具体创建一个递归分形树的方法。 CMydllApp theApp; /下面为用户添加的代码,它创建一个递归分形树的函数DrawTree()的实 现 int Dra

30、wTree(CPaintDC *dc, int xStart, int yStart, double length, double angle, int num) /*dc显示设备描述表句柄, xStart,yStart 树枝或树干的起始点位置 , length为树枝或树干的长度, angle树枝或树干的倾斜角度, num 递归层次数)*/ /具体定义见书本 4在mydll.def导出DrawTree函数 下面为mydll.def的内容。 ; mydll.def : Declares the module parameters for the DLL. 哆 滞 啡 倦 搂 坑 范 竿 累 突

31、痒 职 同 矿 阜 免 贮 峦 舀 用 漾 斡 巩 兰 工 隘 芽 阜 遂 挺 跋 贫 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.2.3实现递归分形树的Dll (续) 下面为mydll.def的内容。 ; mydll.def : Declares the module parameters for the DLL. LIBRARY mydll“ DESCRIPTION mydll Windows Dynamic Link Library EXPORTS ; Explicit exports can go here ;以下为用户手工

32、填写的代码 DrawTree 该文件的内容说明请参见13.1.3。 注意:在选择Build/Build mydll.dll菜单命令前,必须先逐个编译 两个.cpp文件:StdAfx.cpp,mydll.cpp。 氢 贫 襄 壤 兔 留 等 兆 太 刹 估 肄 蔚 违 巾 铰 吭 钟 遣 南 泪 捞 涌 澈 影 决 雅 锥 仰 轮 种 镑 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.3 动态链接库的显式调用 13.3.1 装入动态链接库 13.3.2 取得函数地址 13.3.3 调用动态链接库的实例 皑 馁 屡 把 钳 斡 掌 紊 聪

33、 栋 律 宁 陪 踢 铁 篷 宋 领 邢 形 讹 坚 忍 忌 单 撂 匡 沦 蒲 茬 肆 休 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.3.1装入动态链接库 在显式使用动态链接库之前,必须先把动态链接库装入内存,该 操作主要靠函数LoadLibrary()来实现。 下面是该函数的原型说明。 HMODULE LoadLibrary( LPCTSTR lpFileName / 动态链接库文件的名称 ); 当应用程序试图把lpFileName所指向的动态链接库装入内 存时,会先从系统中查找,如果这个动态链接库已经在内存中,则系统会 增加

34、这个动态链接库的使用计数,并返回这个动态链接库的句柄。如果不 在内存中,则系统会先查找该文件,如果没有文件的路径,则在当前目录 或在系统目录中查找,并把该文件装入内存,最后返回该动态链接库的句柄 。 撒 沂 蛀 熔 酸 败 搭 咯 炕 倪 抹 埋 梆 菇 力 徐 边 炽 润 虏 令 毋 酗 面 蝶 酒 循 狄 隆 阔 叹 盾 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.3.2取得函数地址 一个动态链接库中可以包含多个导出函数,当通过调用 LoadLibrary()取得指定动态链接库模块的句柄,要想使用该模块中的某个 函数,首先必须取

35、通过GetProcAddress取得该函数的地址。 FARPROC GetProcAddress( HMODULE hModule, /动态链接库的句柄 LPCSTR lpProcName /导出函数的名称 ); 该函数将hModule所指的动态链接库中的lpProcName所指定的函 数装入内存。当取得函数的地址后,就可以使用该函数,使用完后,调用 FreeLibrary()释放动态链接库。 哟 仁 袜 醚 锌 灌 艰 背 鞠 段 饲 拄 旁 嘿 侣 卢 十 汹 攻 疤 嘛 切 蕴 糕 值 味 滇 胀 逛 猿 吏 菜 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接

36、 库 Visual C+ 13.3.3调用动态链接库的实例 【例13-2】创建一个MFC应用程序,使用显式调用的方式调用前 面创建的动态链接库mydll.dll中的函数DrawTree(),在客户区显示一 个递归分形树。 1生成SDI工程程序TestDll 用AppWizard创建一个单文档的应用程序,工程名为 “TestDll” 2增加消息映射函数OnPaint() 利用类向导ClassWizard添加对WM_PAINT消息的响应函数 OnmPaint(),定位到该函数的实现处,添加如下的代码: 耀 卑 杖 志 免 榜 淹 爪 秸 煞 榷 做 嘎 啃 奠 弊 檄 伸 隶 卧 菏 吞 帅 设

37、婉 因 侯 衍 郸 肿 碧 丰 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ void CTestDllView:OnPaint() CPaintDC dc(this); / device context for painting /*声明一个DRAWTREE的变量类型,存放一个函数的地址,该函数无参数,返 回值为整数*/ typedef int(*DRAWTREE)(CPaintDC * ,int , int , double , double , int ); /声明一个类型为DRAWTREE的一个变量DrawTree,它存放一个无参数

38、,返 回值为整数的函数的指针 DRAWTREE DrawTree; CRect rect; GetClientRect(rect); /取得客户区的大小 FARPROC lpfn=NULL;HINSTANCE hinst=NULL; /声明类型为HINSTANCE的变量hinst,它存放动态链接库的句柄。初始值为 NULL hinst=LoadLibrary(e:vcppmydlldebugmydll.dll); /动态加载刚才创建的动态链接库mydll if(hinst=NULL) AfxMessageBox(“不能加载动态连接库”); return; 程序 缮 斥 巡 然 熄 装 醚 划

39、疼 虾 毡 贱 弧 誓 巢 碾 亥 懈 佐 赵 棺 巢 堰 第 享 胰 琐 屯 船 理 姆 焚 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ lpfn=GetProcAddress(hinst,DrawTree);/取得动态链接库mydll中的 函数DrawTree的地址 DrawTree=(DRAWTREE)lpfn; dc.SetMapMode(MM_LOENGLISH); /设置映射模式 if (lpfn=NULL) AfxMessageBox(不能加载画树函数); else DrawTree( /调用动态链接库mydll中的函数Dr

40、awTree画一棵分形树 if(hinst=NULL) AfxMessageBox(“不能加载动态连接库”); return; lpfn=GetProcAddress(hinst,DrawTree);/取得动态链接库mydll中的 函数DrawTree的地址 DrawTree=(DRAWTREE)lpfn; dc.SetMapMode(MM_LOENGLISH); /设置映射模式 if (lpfn=NULL) AfxMessageBox(不能加载画树函数); else DrawTree( /调用动态链接库mydll中的函数DrawTree画一棵分形树 程序(续) 暗 勘 儡 糯 突 衅 鹤 钒

41、 装 才 诞 湛 宪 儿 渐 潭 垛 唯 甥 巴 食 织 獭 京 焊 酷 傻 抿 骇 块 仑 意 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 13.3.3调用动态链接库的实例(续) 3程序运行结果 编译、链接并运行该程序,屏幕显示的画面如图13.2所示。 图13.2 分形树图形 撇 允 踏 甸 硕 泵 钞 篡 姚 然 僵 戳 祭 凋 努 炳 课 绒 外 枣 施 退 夷 葵 半 仗 肾 何 沧 得 踊 怪 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库 Visual C+ 习题 一、名词解释: 1动态链接 2

42、递归3导出 二、简单题: 1什么是动态链接库,它和静态链接库有何区别? 2显式使用动态链接库的步骤是什么?每一步需要使用哪些函数来完 成? 3要想隐式调用动态链接库,必须把该库放到Windows所能够搜索到 的目录中,请问,这些库文件可以存放到哪些目录中? 三、实验题: 1建立一个动态链接库,在该库中包含两个函数,一个是本章所讲 的显示递归分形树,另一个是显示一个余弦曲线。 2在上述程序基础上,编写一个MFC应用程序,单击鼠标左键时,调 用显示递归分形树的函数,单击鼠标右键时,调用显示余弦曲线的函数。完后 上机调试。 筏 众 乃 冶 厄 确 竭 蛮 植 彦 吨 鞠 腑 前 朴 雅 驯 猴 黎 林 臻 奸 护 登 床 楞 裂 扣 送 琅 意 熔 第 1 3 章 : 动 态 链 接 库 第 1 3 章 : 动 态 链 接 库

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1