动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体它里面包含的是公共代码或资源由于DLL代码使用了内存共享技术在某些地方windows也给了DLL一些更高的权限因而DLL中可以实现一些一般程序所不能实现的功能如实现windows的HOOKISAPI等同时DLL还为不同语言间代码共享提供了一条方便的途径因而DLL在编程时应用较为广泛本文将介绍如何在 Delphi 中建立和使用DLL
一DLL 库内存共享机制
从使用效果看DLL和unit 很像它们都可以被别的工程模块所调用但二者在内部的实现机制上确存在着差别如果一个程序模块中用uses语句引用了某个unit编译程序在编译该模块时便会连同unit一起编译并把编译后的可执行代码链接到本程序模块中这就是一个程序模块能够调用所引用unit中过程和函数的原因当同一个unit被多个工程所引用时则每个工程中都含有该unit的可执行代码当含有该unit的多个工程同时执行时unit的可执行代码会随不同工程而多次被调入内存造成内存资源的浪费DLL则不同它即使被某个工程调用编译后仍是独立的也就是说编译后一个DLL库形成一个单独的可执行文件而不与任何其它的可执行文件连接在一起因而DLL库并不从属于某个特定的工程当多个工程调用同一个DLL库时只有第一个工程把DLL库调入内存其余工程并不重复调入同一个DLL库到内存而是到同一个共享内存区读取并且DLL的执行代码是在程序运行期间动态调入的而不是如unit在程序运行时就与整个工程一起调入内存这样便可消除unit带来的相同代码多处占用内存的弊病
二 Delphi中DLL库的建立
在Delphi环境中编写一个DLL同编写一个一般的应用程序并没有太大的区别事实上作为DLL主体的DLL函数的编写除了在内存资源的管理上有所不同外并不需要其它特别的手段
一般工程文件的格式为
program 工程标题;
uses 子句;
程序体
而DLLs工程文件的格式为
library 工程标题;
uses 子句;
exprots 子句;
程序体
它们主要的区别有两点
一般工程文件的头标用program关键字而DLL工程文件头标用library 关键字不同的关键字通知编译器生成不同的可执行文件用program关键字生成的是exe文件而用library关键字生成的是dll文件;
假如DLL要输出供其它应用程序使用的函数或过程则必须将这些函数或过程列在exports子句中而这些函数或过程本身必须用export编译指令进行编译
在Delphi主菜单file 中选new项在弹出的窗口中双击DLL图标便会自动给出DLL源模块框架如下
以下是引用片段
Libraryproject;
{注释}
uses
SysUtilsClasses;
begin
end
接下来便可在USES和begin之间加入想在该DLL中实现的过程和函数的定义并用export和exprots保字把它们引出以便别的模块引用在begin和end之间加入初始化代码初始化代码是用来对DLL变量初始化的应注意即便无初始化代码begin与end也不可省略如下例:
以下是引用片段
libraryminmax;
functionMin(XY:Integer):Integer;export;
begin
ifX<YthenMin:=XelseMin:=Y;
end;
functionMax(XY:Integer):Integer;export;
begin
ifX>YthenMax:=XelseMax:=Y;
end;
exports
Minindex
Maxindex;
egin
end
经编译后并以minmaxDLL存盘后一个DLL库文件便形成了
delphi 中动态链接库(dll)的建立和使用 来自: 免费论文网
[] []