第 7 讲 Visual C++ 动态链接库程序设计.ppt_第1页
第 7 讲 Visual C++ 动态链接库程序设计.ppt_第2页
第 7 讲 Visual C++ 动态链接库程序设计.ppt_第3页
第 7 讲 Visual C++ 动态链接库程序设计.ppt_第4页
第 7 讲 Visual C++ 动态链接库程序设计.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中国地质大学 武汉 计算机学院 第十三章动态链接库 VisualC DynamicLinkLibrary 一 动态链接库概述二 动态链接库的创建三 动态链接库的调用 中国地质大学计算机学院 一 动态链接库概述 1 动态链接库定义2 静态链接与动态链接3 导出与导入4 隐式链接与显式链接5 搜索动态链接库动态链接库的优点动态链接库的分类动态链接库的原理 中国地质大学计算机学院 1 动态链接库定义 动态链接库 DynamicLinkLibrary 简称DLL 是一个包含了若干函数的可执行模块 它实质上是一个函数包 Windows应用程序可以调用这些函数来完成实际的任务 DLL在Windows环境中起着重要的作用 Windows利用DLL来建立Windows应用程序可以使用的Windows函数与资源 动态链接库是一个文件 其中包含有函数或全局变量 使用他们就像应用程序使用自己定义的函数一样 用API开发Windows应用程序 实质就是调用Windows操作系统下的动态链接库 中国地质大学计算机学院 2 静态链接与动态链接 DLL与运行函数库 如C语言的运行函数库 类似 二者主要区别在于库代码的链接时机不同 静态链接库在多任务环境中建立与运行时效率可能很低 一方面 如果两个应用程序同时运行 且它们使用了同一个静态库中的函数 那么就要求系统中出现该函数的两个副本 这显然降低了内存的使用效率 另一方面 对于比较复杂的问题 应用静态链接库将导致最终的应用程序长度超过系统内存而无法运行 DLL是在运行期间才被链接进来 该操作由Windows操作系统自身来完成 而运行函数库则是在程序链接期间由应用程序的链接器如LINK EXE来完成 运行函数库的链接被称为 静态链接 它把函数代码链接到应用程序中 增加了应用程序最终执行代码的长度 它的主要优点是建立了一个应用程序可以利用的标准函数集 这样在开发应用程序时就无需包含函数库中所包含的函数源代码 中国地质大学计算机学院 2 静态链接与动态链接 续 与静态链接库不同 动态链接库则允许若干个应用程序共享某个函数的单个副本 事实上 每个WindowsAPI函数 如GetMesssage CreateWindow 和TextOut 分别留于动态链接库 Kernel32 dll User32 dll Gdi32 dll之中 如果两个应用程序同时运行 且都使用了某个特定的Windows函数 那么它们将共享该函数代码的单个副本 DLL除了实现代码的共享外 还可以实现其它资源的共享 如数据和硬件资源的共享 Windows的设备驱动程序允许应用程序共享硬件资源 这些设备驱动程序就是以动态链接库的形式来出现 从某种程度上讲 动态链接库也是一种类型的计算机资源 一个动态链接库可以为多个应用程序使用 如果一个应用程序使用了某个动态链接库中函数 若库不存在 则调用将不能完成 中国地质大学计算机学院 3 导出与导入 动态链接库是一个 DLL文件 它存放在特定的位置上 程序员所创建的动态链接库中的函数要有导出标志 在使用动态链接库中的函数的程序中 要具有导入标志 动态链接库中的函数并不是杂乱无章地堆放在一起 它们都有一个标志 即动态链接库中的导出标志 同样 如果应用程序要使用该库中的函数 也要向动态链接库发出 是否有我们想要的函数 这通过导入标志来进行 双方必须达成一致后才能使用 中国地质大学计算机学院 3 导出与导入 续 从DLL中可以导出 API函数类数据和资源导出方式 1 使用def文件导出 2 使用关键字 declspec dllexport 导出 3 使用宏导出 中国地质大学计算机学院 4 隐式链接与显式链接 隐式链接若在代码中没有明确指定应用程序要装入的动态链接库 但却使用其中的某个函数 这种链接的方式称为隐式链接 利用VC可以编写各种DLL程序 其最终目的是在应用程序中调用DLL 链接DLL到可执行程序有两种方式 隐式链接 Implicitlinking 显式链接 Explicitlinking 中国地质大学计算机学院 4 隐式链接与显式链接 续 显式链接显示链接 又称显式调用 是由编程者用API函数LoadLibrary 加载DLL 并通过GetProcessAddress 来获取应用程序要调用的导出函数指针来调用DLL的导出函数 最后通过FreeLibrary 卸载DLL 它是一种动态调用的方式 通过它能够有效地使用内存 是编制大型应用程序的重要方式 中国地质大学计算机学院 5 搜索动态链接库 在隐式调用的应用程序运行时 需要寻找它所用的动态链接库 并且把它们加载到进程的虚拟地址空间内 为了使应用程序正常地使用动态链接库 必须将 DLL文件存放在下列任何一个子目录中 Windows操作系统也是按照下列顺序来搜索动态链接库的 1 应用程序所在的当前目录 2 Windows系统目录c windows system或c windows system32子目录 3 Windows目录 如C Windows子目录 4 在Path环境变量中列出的一系列目录 中国地质大学计算机学院 6 动态链接库的优点 动态链接库非常有利于软件的编写和更新 在编写程序时 可以把一个大型软件项目分割为多个单独模块 在这些模块中定义好它们的调用关系 然后分别由多个程序员进行编写 在各个模块内 程序员可以充分发挥他们的创造性 优化程序代码 而且 利用动态链接库对于软件的更新也是非常有好处的 在更新或者升级这个软件时 可以只更新这个软件的动态链接库 现代应用程序广泛地使用动态链接库 其好处是 1 同时运行的多个应用程序可以同时使用同一个动态链接库 它们在内存中只是共享DLL文件的一个拷贝 2 只要编写的应用程序函数 变量和返回值的类型和数量不发生变化 动态链接库中的函数可以不用重新编译链接而且直接使用 这一点明显优于静态链接 3 只要遵循一定的规则 不同语言编写的应用程序可以调用同一个动态链接库 而不管这个函数执行什么操作 4 在设计应用程序时 将其拆分成功能相互独立的部件 DLL 为以后对这些功能部件各自升级提供较方便的途径 5 使资源数据独立于可执行程序之外 但又能较方便快速地访问它 中国地质大学计算机学院 7 动态链接库的分类 利用VC的应用程序向导生成动态链接库程序的框架的方法是 在VC开发环境下 选择File New Projects MFCAppWizard Dll 在ProjectName编辑框中输入一个工程名后 单击OK按钮就会出现图13 1所示的选择动态链接库类型的对话框 VC向导可以创建三种类型的动态链接库 1 普通静态链接MFC的DLL普通静态链接MFC的DLL就是图13 1的第一种类型 RegularDLLWithMFCstaticlinked 该种形式的DLL可以被任何Win32的应用程序 不论是使用API开发的 还是使用MFC开发的 调用 但它不能与动态MFC链接 在该种DLL中 可以使用MFC类库 但使用的方式是静态链接 中国地质大学计算机学院 7 动态链接库的类 续 2 普通动态链接MFC的DLL普通动态链接MFC的DLL就是图13 1的第二种类型 RegularDLLusingsharedMFCDLL 和第一种DLL相似 都可被任何Win32的应用程序 API开发的或使用MFC开发的 调用 只不过第一种DLL的函数是与MFC静态链接 而第二种DLL中的函数是与MFC动态链接 3 扩展的DLL扩展的DLL就是图13 1中的第三种类型 MFCExtensionDllusingsharedMFCDLL 该类DLL只能被使用MFC动态链接的MFC应用程序 即有一个CWinApp的派生类对象 调用 而不能被非MFC应用程序调用 并且在该DLL中不仅可以导出函数和变量 而且还可以导出整个类 中国地质大学计算机学院 图13 1三种形式的动态链接库 中国地质大学计算机学院 7 动态链接库的分类 续 在上述三种类型的动态链接库中都可以使用MFC 如果不想在DLL中使用MFC 可以采用VC生成的第四种动态链接库 4 Win32ApplicationDLL在VC开发环境下 选择File New Projects Win32Dynamic LinkedLibrary 在ProjectName编辑框中输入一个工程名后 单击OK按钮就会出现选择DLL的对话框 选择第三个选项后 按 Finish 按钮 就生成了动态链接库的框架 该种DLL是最基础的DLL 简单来说 前面三种DLL都可以由这种方法来构建 它所包含的VC头文件最少 可以生成最为简练的DLL 中国地质大学计算机学院 8 动态链接库工作原理 对于动态链接库而言 会有许多进程同时共享它的代码 所以Windows子系统会把它们装入内存映射文件 在应用程序打开动态链接库时 就把动态链接库的执行代码映射到使用它的每个进程地址空间中 当应用程序调用动态链接库时 系统首先会为这个动态链接库建立一个文件映射对象 然后搜索调用者的地址空间 为这个动态链接库寻找空间 将文件映射到进程的地址空间中 随后 操作系统检查调用者和动态链接库的引用表 并把为每个DLL函数所分配的虚地址插入到调用者的输入库中 多个进程调用相同的动态链接库时 这个动态链接库会被映射到不同的虚地址 当一个进程装入一个动态链接库时 系统把动态链接库中的数据和代码映射到进程的地址空间中 动态链接库中的任何内存分配都是从进程的地址空间中分配的 而任何其它进程都不能访问这块内存 每个进程都有一套属于它自己的动态链接库的全局和静态变量 中国地质大学计算机学院 二 动态链接库的创建 1 新建一个缺省的项目2 导出API3 导出类及方法 中国地质大学计算机学院 程序 中国地质大学计算机学院 程序 中国地质大学计算机学院 程序 中国地质大学计算机学院 程序 中国地质大学计算机学院 程序 中国地质大学计算机学院 程序 中国地质大学计算机学院 程序 续 中国地质大学计算机学院 三 动态链接库的调用 1 包含头文件2 调用DLL中的API3 调用DLL中的类及方法 中国地质大学计算机学院 13 3 3调用动态链接库的实例 续 中国地质大学计算机学院 13 3 3调用动态链接库的实例 续 中国地质大学计算机学院 13 3 3调用动态链接库的实例 续 中国地质大学计算机学院 13 3 3调用动态链接库的实例 续

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论