第10章DLL的应用 本章要点: 区DLL的基本概念 区DLL的创建 区DLL的静态调用方式 区DLL的动态调用方式 区利用DLL实现窗体重用
本章要点: DLL的基本概念 DLL的创建 DLL的静态调用方式 DLL的动态调用方式 利用DLL实现窗体重用 第10章 DLL的应用
101DLL概述 动态链接库( Dynamic Link Library,缩写为DLL)是编写 Windows应用程序的关键部件。它是一种程序模块,是实现 Windows应用程序代码重用与共享的重要手段。通过DLL可以 实现多个应用程序共享代码和资源。在使用 Windows操作系统 的过程中,可以在系统目录中发现很多以DLL为扩展名的文件, 事实上它是 Windows操作系统中非常重要的一部分。许多可视 化开发工具(如Vsua| Basic)并不支持DLL的创建,而 Delphi 7.0在DLL的使用方面有非常优秀的表现。本章将介绍动态链 接库方面的内容,包括动态链接库的工作原理、编写、调用方 式及利用DLL实现窗体重用和数据共享,相信通过对本章的学 习,你可以基本掌握DLL的创建及应用。 Inprise Dephi
10.1 DLL概述 动态链接库(Dynamic Link Library,缩写为DLL)是编写 Windows应用程序的关键部件。它是一种程序模块,是实现 Windows应用程序代码重用与共享的重要手段。通过DLL可以 实现多个应用程序共享代码和资源。在使用Windows操作系统 的过程中,可以在系统目录中发现很多以DLL为扩展名的文件, 事实上它是Windows操作系统中非常重要的一部分。许多可视 化开发工具(如Visual Basic)并不支持DLL的创建,而Delphi 7.0在DLL的使用方面有非常优秀的表现。本章将介绍动态链 接库方面的内容,包括动态链接库的工作原理、编写、调用方 式及利用DLL实现窗体重用和数据共享,相信通过对本章的学 习,你可以基本掌握DLL的创建及应用
1011DLL的基本概念 1.什么是动态链接库 DLL是一个可以被其他应用程序共享的程序模块,其中包含了一些可以 被多个 Windows应用程序共享的代码、数据和资源。DLL主要的用途是使应 用程序可以在运行时刻载入其中的代码,而不是在编译的时刻链接到应用程 序中。动态链接库文件的扩展名一般是dl,也有可能是drv、Sys和fon( 它们分别对应的是设备驱动文件、系统文件和字体资源文件)。它和可执行文 件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行, 只能由 Windows应用程序直接或间接调用。 2.静态链接和动态链接( Static Linking and Dynamic Linking 早期DOS下的C语言版本中提供了许多含有大量函数的头文件(h文 件),所有的标准库函数都存在某一个函数库中,这些函数的代码在编译后 直接包含在应用程序中。但随着 Windows多任务环境的出现,函数库的方法 显得过于累赘。应用程序为了完成诸如屏幕输出、消息处理、内存管理、对 话框等操作,不得不拥有自己的函数,这样, Windows应用程序就变得非常 庞大,而 Windows的发展要求允许同时运行的几个程序共享一组涵数的单 拷贝 Inprise Dephi
10.1.1 DLL的基本概念 它们分别对应的是设备驱动文件、系统文件和字体资源文件)。它和可执行文 件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行, 只能由Windows应用程序直接或间接调用。 2. 静态链接和动态链接(Static Linking and Dynamic Linking) 早期DOS下的C语言版本中提供了许多含有大量函数的头文件(.h文 件),所有的标准库函数都存在某一个函数库中,这些函数的代码在编译后 直接包含在应用程序中。但随着Windows多任务环境的出现,函数库的方法 显得过于累赘。应用程序为了完成诸如屏幕输出、消息处理、内存管理、对 话框等操作,不得不拥有自己的函数,这样,Windows应用程序就变得非常 庞大,而Windows 的发展要求允许同时运行的几个程序共享一组函数的单 一拷贝。 1. 什么是动态链接库 DLL是一个可以被其他应用程序共享的程序模块,其中包含了一些可以 被多个Windows应用程序共享的代码、数据和资源。DLL主要的用途是使应 用程序可以在运行时刻载入其中的代码,而不是在编译的时刻链接到应用程 序中。动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon(
1011DLL的基本概念 在链接应用程序过程中,连接器从库文件中将这些被应用程序调用的函数 代码添加到可执行文件中。所谓静态链接是指把要调用的函数或过程直接链接 的,动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件不学 到可执行文件中,成为可执行文件的一部分。动态链接是相对于静态链接而 而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。 图10-1描述了系统在静态链接和动态链接时的调用过程,其中动态链接 时生成的文件明显小于静态链接所生成的文件,这是使用DLL的优势 源代码 库DCU 可执行文件 动态链接 可执行文件 动态链接库2(DLL) 图10-1静态链接和动态链接 uprise Dephi
10.1.1 DLL的基本概念 图10-1描述了系统在静态链接和动态链接时的调用过程,其中动态链接 时生成的文件明显小于静态链接所生成的文件,这是使用DLL的优势。 图10-1 静态链接和动态链接 在链接应用程序过程中,连接器从库文件中将这些被应用程序调用的函数 代码添加到可执行文件中。所谓静态链接是指把要调用的函数或过程直接链接 到可执行文件中,成为可执行文件的一部分。动态链接是相对于静态链接而言 的,动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去, 而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)
10.12使用DL的优点( 使用DLL建立一个可执行文件时,DLL只是被映射到应用程序进程的地 址空间中,不管多少程序使用DLL,内存中都只有该DLL的一个拷贝,而当 没有程序使用它时,系统就将其移出内存。使用DLL有许多优点,大体上说 使用动态链接库可以共享代码和系统资源,可以隐藏实现代码的细节及拓 展开发工具的功能,下面分别讨论这几方面的内容 1.多个应用程序共享代码、资源和数据 使用DLL主要是为了实现共享代码,DLL可以让在任何可以调用DLL函 数的 Windows应用程序之间共享代码。同时,DLL提供了共享资源的手段, 如位图、字体、图标等资源可以直接放在DLL中,以便多个应用程序同时使 用它们,从而节省了内存空间。 2.隐藏实现的细节 有时希望隐藏DLL中例程的实施细节。事实上DLL只提供函数的调用而 不泄漏实现的源代码。如果希望应用程序访问DLL,只要提供接口单元让其 他人可以访问即可。 Delph7.0中的 Windows单元就是Wn32DLL的接口单 元,即 Windows.pas文件 Inprise Deph
10.1.2 使用DLL的优点(1) 2. 隐藏实现的细节 有时希望隐藏DLL中例程的实施细节。事实上DLL只提供函数的调用而 不泄漏实现的源代码。如果希望应用程序访问DLL,只要提供接口单元让其 他人可以访问即可。Delphi 7.0中的Windows单元就是Win32 DLL的接口单 元,即Windows.pas 文件。 1. 多个应用程序共享代码、资源和数据 使用DLL主要是为了实现共享代码,DLL可以让在任何可以调用DLL函 数的Windows应用程序之间共享代码。同时,DLL提供了共享资源的手段, 如位图、字体、图标等资源可以直接放在DLL中,以便多个应用程序同时使 用它们,从而节省了内存空间。 使用DLL建立一个可执行文件时,DLL只是被映射到应用程序进程的地 址空间中,不管多少程序使用DLL,内存中都只有该DLL的一个拷贝,而当 没有程序使用它时,系统就将其移出内存。使用DLL有许多优点,大体上说, 使用动态链接库可以共享代码和系统资源,可以隐藏实现代码的细节及拓 展开发工具的功能,下面分别讨论这几方面的内容
10.12使用DLL的优点(2) 3.拓展开发工具的功能 DLL还具有语言无关性,可以在 Delphi7.0环境中创建被C++、VB 或其他支持DLL的语言使用DLL:同样也可用其他语言创建被 Delphi7.0 使用的DL。这样,如果一种语言存在不足,就可以通过访问另一种语 言创建的DLL来弥补,从而拓展了开发工具的功能。 10.2DLL的创建 根据DLL所完成的功能,把DLL分为以下三类: s完成一般功能的DLL; s用于数据交换的DLL s用于窗体重用的DLL。 Inprise Dephi
10.1.2 使用DLL的优点(2) 根据DLL所完成的功能,把DLL分为以下三类: 完成一般功能的DLL; 用于数据交换的DLL; 用于窗体重用的DLL。 10.2 DLL的创建 3. 拓展开发工具的功能 DLL还具有语言无关性,可以在Delphi 7.0环境中创建被C++、VB 或其他支持DLL的语言使用DLL;同样也可用其他语言创建被Delphi 7.0 使用的DLL。这样,如果一种语言存在不足,就可以通过访问另一种语 言创建的DLL来弥补,从而拓展了开发工具的功能
1021DLL工程文件 在 Delphi7.0中,编写一个DLL和编写一个一般的应用程序并没有太大 的区别,真正的不同在它们的工程文件上,一般应用程序的工程文件的格式 为 program工程名; uses子句; 程序体 而DLL工程文件的格式为: ibay工程名 UseS子句; exports子句; 程序体 说明两点 (1)一般应用程序的工程文件用 program作为关键字,而DLL工程文件用 Library作为关键字。不同的关键字通知 Delphi7.0编译器生成不同的可执行 文件, Program关键字生成eXe文件,而 Librarys关键字生成的是DLL文件 (2)在DLL中供其他应用程序使用的函数和过程必须用 Exports进行输出 Inprise Dephi
10.2.1 DLL工程文件 在Delphi 7.0中,编写一个DLL和编写一个一般的应用程序并没有太大 的区别,真正的不同在它们的工程文件上,一般应用程序的工程文件的格式 为: program 工程名; uses 子句; 程序体 而DLL工程文件的格式为: library 工程名; uses 子句; exports 子句; 程序体 说明两点: (1)一般应用程序的工程文件用program作为关键字,而DLL工程文件用 Library作为关键字。不同的关键字通知Delphi 7.0 编译器生成不同的可执行 文件,Program关键字生成.exe文件,而Librarys 关键字生成的是.DLL文件。 (2)在DLL中供其他应用程序使用的函数和过程必须用Exports进行输出
1022DL中的 Exports子句 格式如下: Exports 1,Ⅹ2,…,Xn; 其中Ⅹ1,X2可以是在 Exports子句之前已声明过的函数或过程,中间用逗 号分隔。在DLL的工程文件中,包含的过程或函数如果不在 Exports子句中列出 则其他应用程序就不能够使用它们。 Exports子句可以出现在一个程序或库的 声明部分,也可以出现在单元文件的 linterface或 mplementation中的任意位置, 出现的次数也没有限制 在动态链接库的输出部分,用到了如下3个标准指示。 (1) Name Name后面接一个字符串,作为该过程或函数的输出名,如 Exports Add name AddInt 则其他应用程序将用 AddIn调用该过程或函数。 (2)Index Index指示为过程或函数分配一个顺序号,如果不使用 I Index编号,则 Delphi7.0编译器将按照顺序进行分配,其数字范围是1-32767,使用ndex可 以加速调用过程或函数。 Inprise Dephi
10.2.2 DLL中的Exports子句 格式如下: Exports X1,X2,……,Xn; 其中X1,X2可以是在Exports子句之前已声明过的函数或过程,中间用逗 号分隔。在DLL的工程文件中,包含的过程或函数如果不在Exports子句中列出, 则其他应用程序就不能够使用它们。Exports子句可以出现在一个程序或库的 声明部分,也可以出现在单元文件的interface或implementation中的任意位置, 出现的次数也没有限制。 在动态链接库的输出部分,用到了如下3个标准指示。 (1)Name Name后面接一个字符串,作为该过程或函数的输出名,如: Exports Add name AddInt; 则其他应用程序将用AddInt调用该过程或函数。 (2)Index Index指示为过程或函数分配一个顺序号,如果不使用Index 编号,则 Delphi 7.0编译器将按照顺序进行分配,其数字范围是1~32767,使用Index可 以加速调用过程或函数
1022DL中的 EXports子句 (3) Resident 使用 Resident,则当DLL载入时,特定的输出信息始终保持在内存中, 这样当其他应用程序调用该过程时,可以比利用名字扫描DLL函数的入口 降低时间的开销。 1023编写DLL1) 起kon参出h 1.建立DLL工程文件 进入 Delphi7.0开发环境中,单击“新建”,出 圆 现图10-2时选择 DLL Wizard,进入代码资源管理器。 图102 Delphi7.0新建 对话框 动态链接库的源文件和程序文件并没有太大的区别,只是程序文件使 用 Program,而动态链接库文件使用 Library作为系统保留字。可以在打开 的资源管理器窗口中输入【例10-1】所示代码 Inprise Dephi
10.2.3 编写DLL (1) (3)Resident 使用Resident,则当DLL载入时,特定的输出信息始终保持在内存中, 这样当其他应用程序调用该过程时,可以比利用名字扫描DLL函数的入口 降低时间的开销。 10.2.2 DLL中的Exports子句 1. 建立DLL工程文件 进入Delphi 7.0开发环境中,单击“新建”,出 现图10-2时选择DLL Wizard,进入代码资源管理器。 图 10-2 Delphi 7.0新建 对话框 动态链接库的源文件和程序文件并没有太大的区别,只是程序文件使 用Program,而动态链接库文件使用Library作为系统保留字。可以在打开 的资源管理器窗口中输入【例10-1】所示代码
1023编写DLL(2) 【例10-1】 MathDIIl dpr具有整数相加和整数相减函数的DLL。 library MathDIl function Add(X,Y: Integer): Integer stdcall begin result: X+Y end function Sub(X, Y: Integer): Integer stdcall begin result: = X-Y end exports Add Sub end Inprise Dephi
10.2.3 编写DLL(2) 【例10-1】 MathDll.dpr具有整数相加和整数相减函数的DLL。 library MathDll; function Add(X,Y:Integer):Integer;stdcall; begin result:=X+Y; end; function Sub(X, Y: Integer):Integer;stdcall; begin result:=X-Y; end; exports Add,Sub; end