第10章动态链接库(DLL) 应用编程 本章要点: 区动态链接库(DIL)的概念 区动态链接库的编写 多区动态链接库的隐式调用和显示调用 区利用动态链接库实现窗体重用的方法
第10章 动态链接库(DLL) 应用编程 本章要点: 动态链接库(DLL)的概念 动态链接库的编写 动态链接库的隐式调用和显示调用 利用动态链接库实现窗体重用的方法
10.1循序渐进学理论 10.1.1动态链接库(DLL)概述 1.DLL的概念 DLL是一个可以执行的并可以被多个 Windows应用 程序共享的程序模块(称为 Module),模块中包含了 些可以被多个 Windows应用程序或DLL共享的代码、 数据和资源。 动态连接库文件的扩展名一般是d11,也有可能是 drv,sys和fon(它们分别对应的是设备驱动文件、 系统文件和字体资源文件)
10.1 循序渐进学理论 10.1.1 动态链接库(DLL)概述 1.DLL的概念 DLL是一个可以执行的并可以被多个Windows应用 程序共享的程序模块(称为Module),模块中包含了 一些可以被多个Windows应用程序或DLL共享的代码、 数据和资源。 动态连接库文件的扩展名一般是dll,也有可能是 drv,sys和fon(它们分别对应的是设备驱动文件、 系统文件和字体资源文件)
2.静态链接和动态链接 (1)静态链接 传统的库函数是通过静态链接链到应用程序中的 这些库函数可能来自编程语言提供的标准库,也可能 是由操作系统提供的API。 源代码 函数1函数2 …函数 函数n 图数库 编译 形成的Exe文件入 编译后的OBJ文件 连接 编译后的OBJ文件函数2函数 图10-1静态链接示意图
2.静态链接和动态链接 (1)静态链接 传统的库函数是通过静态链接链到应用程序中的。 这些库函数可能来自编程语言提供的标准库,也可能 是由操作系统提供的API
(2)动态链接 动态链接是指在把应用程序的目标代码链接成 EXE文件时并没有将函数库中的函数复制到应用程序 的可执行文件中,而是在程序运行时动态地加载所需 的函数。 源代码引入库函数1函数2…函数1…函数n LL 编译 内存 形成的EXE文件 编译后的OBJ文件 连接 编译后的OB文件重定位信息…重定位信息] 图10-2动态链接示意图
(2)动态链接 动态链接是指在把应用程序的目标代码链接成 EXE文件时并没有将函数库中的函数复制到应用程序 的可执行文件中,而是在程序运行时动态地加载所需 的函数
3.使用DLL的优点 使用动态链接库还有以下优点: (1)应用范围广。 (2)便于开发大型软件 (3)便于对系统进行升级 (4)隐藏细节。 (5)独立于编程语言
3.使用DLL的优点 使用动态链接库还有以下优点: (1)应用范围广。 (2)便于开发大型软件。 (3)便于对系统进行升级。 (4)隐藏细节。 (5)独立于编程语言
10.1.2动态链接库(DLL)编写 根据动态链接库完成的功能,可把DLL 分成三类:完成一般功能的DLL、用于数据交 换的DLL和用于窗体重用的DLL。 【例10-1】创建一个动态链接库,该动态链接库 中包含两个函数,分别用于求三个数的最大值和最小 值。为编写该动态链接库,需经过以下步骤: (1)建立DL程序框架 在 Delphi7.0集成环境中,执行【File】→ 【New】→【0ther】命令,将会出现【 New items】 对话框窗口,在该窗口中找到【 DLL Wizard】图标, 如图10-3所示
10.1.2 动态链接库(DLL)编写 根据动态链接库完成的功能,可把DLL 分成三类:完成一般功能的DLL、用于数据交 换的DLL和用于窗体重用的DLL。 【例10-1】创建一个动态链接库,该动态链接库 中包含两个函数,分别用于求三个数的最大值和最小 值。为编写该动态链接库,需经过以下步骤: (1)建立DLL程序框架 在Delphi 7.0集成环境中,执行【File】→ 【New】→【Other】命令,将会出现【New Items】 对话框窗口,在该窗口中找到【DLL Wizard】图标, 如图10-3所示
7 Hey Items Projects Data Modules Intraweb WebServices Business webSnap Web Documents Corba New Activex Multitier I Project2I Forms I I Dialogs CLX Frame Component Console Control Panel Control Panel C Application Application Module Data Module DLL Wizard Form Frame Package C Copy C Inherit C Use K Cancel Help 图10-34 New items对话框
图10-3 “New Items”对话框
2.建立过程和函数 为该动态链接库项目增加如下两个函数: Function max( x,y, z: Integer) nteger;sdcl!求三个数的最 大值函数 Function Min (x, y, z: Integer): Integer; stdcall; //3 三个数的最小值函数
2.建立过程和函数 为该动态链接库项目增加如下两个函数: Function Max(x,y,z:Integer):Integer;stdcall;//求三个数的最 大值函数 ········· Function Min(x,y,z:Integer):Integer;stdcall;//求 三个数的最小值函数 ·········
(3)用 exports语句声明供其它应用程序 调用的涵数和过程名 函数或过程定义好后,为了能够被其它应用程序调用, 还必须用 Exports子句把函数名列出。本例使用的 Exports语句如下: exports Max, Min Exports语句的格式与功能如下: exports entry, entry4,.., entry, (4)生成DLL文件 执行【 Project】→【 Build Exam101】命令 (“Exam101”为动态链接库项目文件名),将自动 生成名为“Exam101.d1的动态链接库文件
(3)用exports语句声明供其它应用程序 调用的函数和过程名 函数或过程定义好后,为了能够被其它应用程序调用, 还必须用Exports子句把函数名列出。本例使用的 Exports语句如下: exports Max,Min; Exports语句的格式与功能如下: exports entry1,entry2,……,entryn; (4)生成DLL文件 执 行 【Project】→【Build Exam_10_1】 命 令 (“Exam_10_1”为动态链接库项目文件名),将自动 生成名为“Exam_10_1.dll”的动态链接库文件
1013加载动态链接库(DLL)的方法 1.静态载入DLL 这种方法是将DLL文件映像映射到调用进程地址 空间的最简单的办法。 静态载入DL的前提是在编译之前已经明确知道 要调用DLL中的哪几个函数,编译时在目标文件中只 保留必要的链接信息,而不包含DL函数的代码。在 程序执行时,利用链接信息加载DLL函数代码并在内 存中将其链接进入调用程序的执行空间,从而实现了 代码的重用
10.1.3 加载动态链接库(DLL)的方法 1.静态载入DLL 这种方法是将DLL文件映像映射到调用进程地址 空间的最简单的办法。 静态载入DLL的前提是在编译之前已经明确知道 要调用DLL中的哪几个函数,编译时在目标文件中只 保留必要的链接信息,而不包含DLL函数的代码。在 程序执行时,利用链接信息加载DLL函数代码并在内 存中将其链接进入调用程序的执行空间,从而实现了 代码的重用