动态链接库课件

上传人:我*** 文档编号:144954467 上传时间:2020-09-14 格式:PPT 页数:33 大小:216KB
返回 下载 相关 举报
动态链接库课件_第1页
第1页 / 共33页
动态链接库课件_第2页
第2页 / 共33页
动态链接库课件_第3页
第3页 / 共33页
动态链接库课件_第4页
第4页 / 共33页
动态链接库课件_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《动态链接库课件》由会员分享,可在线阅读,更多相关《动态链接库课件(33页珍藏版)》请在金锄头文库上搜索。

1、DLL动态链接库,第十一章,回顾,WSAEventSelect模型 完成端口,本章目标,进程的虚拟地址空间 虚拟地址空间如何分区 什么是动态链接库(DLL) 为什么使用DLL 如何实现DLL 如何调用DLL DLL应用需要注意的问题,进程的虚拟地址空间,每个进程都被赋予它自己的虚拟地址空间。对于32位进程来说,这个地址空间是4GB 由于每个进程可以接收它自己的私有的地址空间,因此当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于所有其他进程的内存则隐藏着,并且不能被正在运行的线程访问。,虚拟地址空间如何分区,每个进程的虚拟地址空间都要划分成各个分区。地址空间的分区是根据操

2、作系统的基本实现方法来进行的。不同的Windows内核,其分区也略有不同。,NULL指针分配的分区,进程地址空间的这个分区的设置是为了帮助程序员掌握 NULL指针的分配情况。如果你的进程中的线程试图读取该分区的地址空间的数据,或者将数据写入该分区的地址空间,那么CPU就会引发一个访问违规。,MS-DOS/16位Windows应用程序兼容分区,进程地址空间的这个4MB分区是Windows98需 要的,目的是维护MS-DOS应用程序与16位应 用程序之间的兼容性。不应该试图从32位应 用程序来读取该分区的数据,或者将数据写 入该分区。,用户方式分区,这个分区是进程的私有(非共享)地址空间所在的 地

3、方。一个进程不能读取、写入、或者以任何方式 访问驻留在该分区中的另一个进程的数据。对于所 有应用程序来说,该分区是维护进程的大部分数据 的地方。由于每个进程可以得到它自己的私有的、 非共享分区,以便存放它的数据,因此,应用程序 不太可能被其他应用程序所破坏,这使得整个系统 更加健壮。,64 KB禁止进入的分区,这个位于用户方式分区上面的64KB分区是禁 止进入的,访问该分区中的内存的任何企图 均将导致访问违规。Microsoft之所以保留该 分区,是因为这样做将使得Microsoft能够 更加容易地实现操作系统,共享的M M F分区,这个1GB分区是系统用来存放所有32位进程共 享数据的地方。

4、例如,系统的动态链接库 Kernel32.dll、AdvAPI32.dll、User32.dll 和GDI32.dll等,全部存放在这个地址空间分 区中,因此,所有3 2位进程都能很容易同时 访问它们。,内核方式分区,这个分区是存放操作系统代码的地方。用于 线程调度、内存管理、文件系统支持、网络 支持和所有设备驱动程序的代码全部在这个 分区加载。驻留在这个分区中的一切均可被 所有进程共享。,内存映射文件,与虚拟内存一样,内存映射文件可以用来保 留一个地址空间的区域,并将物理存储器提 交给该区域。它们之间的差别是,物理存储 器来自一个已经位于磁盘上的文件,而不是 系统的页文件。一旦该文件被映射,

5、就可以 访问它,就像整个文件已经加载内存一样。,使用内存映射文件,若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件。 2) 创建一个文件映射内核对象,告诉系统该文件的大小和你打算如何访问该文件。 3) 让系统将文件映射对象的全部或一部分映射到你的进程地址空间中。,清除内存映射文件,当完成对内存映射文件的使用时,必须执行下面这些步骤将它清除: 1) 告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像。 2) 关闭文件映射内核对象。 3) 关闭文件内核对象。,什么是动态链接库(DLL),Dynamic Link L

6、ibrary(缩写DLL),在WINDOW平台上使用 本身就是程序模块,即内部由可执行代码、 数据或资源构成; 类似于可执行文件EXE,但不能单独执行, 需要WINDOW应用程序调用;,动态链接库,自从微软推出第一个版本的Windows操作系统以来,动态链接库(DLL)一直是Windows操作系统的基础。 动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。 Windows API中的所有函数都包含在DLL中。其中有3个最重要的DLL,Kernel32.dll,它包

7、含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。,使用动态链接库的好处,可以采用多种编程语言来编写。 增强产品的功能。 提供二次开发的平台。 简化项目管理。 可以节省磁盘空间和内存。 有助于资源的共享。 有助于实现应用程序的本地化。,链接库类型,在应用程序中加载 DLL 时,可以使用两种 链接方法来调用导出的 DLL 函数。 1。加载时进行链接。(静态链接) 2。运行时进行链接。(动态链接),静态链接,静态链接是指在程序进行链接时将要调用的函数或者过程链接到可执

8、行文件中,成为可执行文件的一部分。可执行文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源 使用静态链接,应用程序可以像调用本地函数一样对导出的 DLL 函数进行显式调用,动态链接,动态链接则不是将所调用的函数代码拷贝到应用程序的可执行文件中,而是仅仅在其中加入了所调用函数的描述信息(通常是重定位信息)。当应用程序运行时,才动态地装载DLL。装载DLL时,其代码将被映射到进程的地址空间中,而不是将代码复制到进程中。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows转去执行DLL中相应得函数代码。因此,无

9、论有多少个应用程序使用了DLL,在内存中都只有该DLL的一个副本;而当没有应用程序使用该DLL是,系统将其移出内存。所以,动态链接DLL的一个突出优点是节省资源。,内存示意图,静态链接、动态链接的适用领域,启动性能如果应用程序的初始启动性能很重要,则应使用动态链接。 易用性在静态链接中,导出的 DLL 函数类似于本地函数。这使您可以方便地调用这些函数。 应用程序逻辑在动态链接中,应用程序可以分支,以便按照需要加载不同的模块。例在开发多语言版本时,这一点很重要。,创建DLL模块,1)首先必须创建一个头文件,它包含你想要从DLL输出的函 数原型、结构和符号。 2)要创建一个C/C+源代码模块(或多

10、个模块),用于实现 你想要在DLL模块中实现的函数和变量。 3)创建D L L模块,将使编译器对每个源代码模块进行处 理,产生一个 .obj模块 4)当所有的.obj模块创建完成后,链接程序将所有.obj模块 的内容组合在一起,产生一个DLL映象文件 5)如果链接程序发现DLL的源代码模块至少输出了一个函数 或变量,那么链接程序也生成一个. l i b文件。,创建可执行模块,1)在引用函数、变量、数据、结构或符号的所有源 代码模块中,必须包含DLL开发人员创建的头文件。 2)要创建一个C/C+源代码模块(或多个模块), 用于实现你想要在可执行模块中实现的函数和变量。 3)创建可执行模块,将使编

11、译器对每个源代码模块 进行处理,生成一个 .obj模块 4)当所有. o b j模块创建完成后,链接程序便将所有 的. o b j模块的内容组合起来,生成一个可执行的映 像文件。,DLL中的关键字,_declspec(dllexport) DLL提供接口都时通过export关键字来实现的。在DLL项目文件中,把要输出的函数或过程列在export子句中就可以实现输出。 用关键字export引出函数或过程,表明编译时要用远程地址调用,使得函数或过程在DLL内可被其他模块访问。 _declspec(dllimport) 可执行模块调用dll文件时,通过这个标识指出该函数是通过外部引入的,跟exter

12、nal类似 stdcall 使用stdcall方式,能够保证不同语言写的DLL兼容性。,创建DLL实例,. 在DLL中可以传出任何数据。包括数值、类对象、指针、数组、甚至于窗体等。,DLL调用,静态调用 在程序编译时,就明确DLL中哪些函数被使用;在程序执行时,整个DLL就被装载入内存,直到程序退出,DLL才从内存卸载 动态调用 程序运行期间,根据需要将DLL功能或函数装载到内存中供执行,函数执行完成后,可以马上从内存卸载;即函数的执行周期就是函数的生命周期,静态调用方法,在调用DLL的程序中声明要调用的外部DLL函数;声明形式如下:,extern 函数返回类型 MyFuncName(参数表)

13、; 或 _declspec(dllimport) 函数返回类型 MyFuncName(参数表);,注意: 1、参数类型尽量使用与window C+兼容,包括“实参”和“形参” 2、external子句指定dll所在位置,可以加路径;如果没有路径, 默认在window的搜索路径或者与调用程序同一路径,动态调用,1、获取DLL的句柄 HMODULE hndDll; hndDll := LoadLibrary(DLL文件名); /可以加路径 2、获取DLL函数的内存地址 /声明函数指针类型 typedef 返回类型 (*FuncType)(参数列表); /定义函数地址变量 FuncType init

14、Data; initData = GetProcAddress(dll句柄,dll函数名); 3、调用函数 initData(参数); 4、释放内存空间 FreeLibrary(dll句柄);,DLL调用实例,静态调用实例 动态调用实例,DLL应用技巧,1 、为了保证DLL的正确性,可先编写成普通的应用程序的一部分,调试无误后再从主程序中分离出来,编译成DLL。 2 、为了保证DLL的通用性,应该在自己编写的DLL中杜绝出现可视化控件的名称,如:Edit1.Text中的Edit1名称;或者自定义非Windows定义的类型,如某种记录。 3 、为便于调试,每个函数和过程应该尽可能短小精悍,并配合具体详细的注释。 4 、应多利用try-catch来处理可能出现的错误和异常 5、添加DLL的版本信息。版本信息对于DLL是很重要的,如果包含了版本信息,DLL的大小会增加2Kb。增加这么一点空间是值得的。,DLL在项目中应用,顾客显示屏,票据打印机,钱箱,DLL 硬件接口,POS 销售软件,总结,进程的虚拟地址空间 虚拟地址空间如何分区 什么是动态链接库(DLL) 为什么使用DLL 如何实现DLL 如何调用DLL DLL应用需要注意的问题,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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