Delphi 中动态链接库(dll)的建立和使用[1]

Delphi 中动态链接库(dll)的建立和使用[1],第1张

动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体 它里面包含的是公共代码或资源 由于DLL代码使用了内存共享技术 在某些地方windows也给了DLL一些更高的权限 因而DLL中可以实现一些一般程序所不能实现的功能 如实现windows的HOOK ISAPI等 同时 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 项 在d出的窗口中双击DLL图标 便会自动给出DLL源模块框架 如下

以下是引用片段 Library project { 注释 } uses SysUtils  Classesbegin end 

接下来便可在USES和begin之间加入想在该DLL中实现的过程和函数的定义 并用export和exprots保字把它们引出 以便别的模块引用 在begin和end之间加入初始化代码 初始化代码是用来对DLL变量初始化的 应注意 即便无初始化代码begin与end也不可省略 如下例:

以下是引用片段 library minmaxfunction Min(X  Y: Integer): Integer exportbegin if X < Y then Min := X else Min := Yendfunction Max(X  Y: Integer): Integer exportbegin if X > Y then Max := X else Max := Yendexports Min index  Max index  egin end 经编译后 并以minmax DLL存盘后 一个DLL库文件便形成了

delphi 中动态链接库(dll)的建立和使用 来自: 免费论文网

lishixinzhi/Article/program/Delphi/201311/25064

delphi 提供了一个编写 dll 动态库的向导:

点击“OK”按钮,会自动生成一个 dll 库的单元文件。

编写代码后,保存并编译就会生成 .dll 动态库。

dll 里函数的编写,根据具体功能来编写代码,需要提示的几点是:

1、通常函数添加 stdcall 指示字。

2、在 Exports 节列出需要供其他程序调用的函数接口。

DLL写法:

library DLL

uses

SysUtils,

Classes

procedure procstdcall//加上stdcall关键字

begin

。。。。

end

exports //申明的函数在这里导出以被其他程序调用

proc

begin

end.

调用则有两种方法

一种是静态 只需写

procedure procstdcall external 'DLL.dll'

便可当一般函数调用

另一种是动态

type

TProc = procedurestdcall

var

DLLHandle: THandle//DLL句柄

proc = TProc//函数变量

begin

DLLHandle := LoadLibrary('DLL.dll')//Load DLL

@proc := GetProcAddress(DLLHandle, 'proc')//得到函数的地址

proc//调用过程

FreeLibrary(DLLHandle)//释放

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7835975.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存