Delphi 中动态链接库(dll)的建立和使用-Delphi-优质IT资源分享社区

yutingzhidong
总版主
总版主
  • UID2
  • 粉丝18
  • 关注1
  • 发帖数11
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:173回复:0

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

楼主#
更多 发布于:2016-06-14 11:58

动态链接库是一个能够被运用程序和其它的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 子句;
程序体
它们首要的差异有两点:
1.通常工程文件的头标用program关键词,而DLL工程文件头标用library
关键词。不一样的关键词告诉编译器生成不一样的可履行文件。用program关键词生成的是.exe文件,而用library关键词生成的是.dll文件;
2.假设DLL要输出供其它运用程序运用的函数或进程,则必须将这些函数或进程列在exports子句中。而这些函数或进程自身必须用export编译指令进行编译。
在Delphi主菜单file 中选new...项,在弹出的窗口中双击DLL图标,便会主动给出DLL源模块结构,如下:
以下是引证片段:
Library project1;
{...注释...}
uses
SysUtils, Classes;
begin
end
接下来便可在USES和begin之间参加想在该DLL中完成的进程和函数的界说,并用export和exprots保字把它们引出,以便其他模块引证,在begin和end之间参加初始化代码,初始化代码是用来对DLL变量初始化的。应留意,即便无初始化代码begin与end也不行省掉,如下例:
以下是引证片段:
library minmax;
function Min(X, Y: Integer): Integer; export;
begin
if X < Y then Min := X else Min := Y;
end;
function Max(X, Y: Integer): Integer; export;
begin
if X > Y then Max := X else Max := Y;
end;
exports
Min index 1,
Max index 2;
egin
end.
经编译后,并以minmax.DLL存盘后,一个DLL库文件便构成了。
delphi 中动态链接库(dll)的树立和运用 来自: 免费论文网
三 DLL库的拜访
拜访DLL库有两种方法,一种是静态引证,另一种是动态引证。
用静态引证这种方法装入DLL要做两件事情:为DLL 库创立一个输入单元,以及
用USES把输入单元衔接到要运用DLL
函数的程序模块中。为DLL库创立的输入单元与一般的单元的差异仅在于:在它的接口处声明的进程、函数,并不在它的完成有些给出真正的完成代码,而是用external关键词把进程、函数的完成细节托付给外部DLL模块。
external指令的运用语法如下:
procedure /function 进程/函数名;external DLL模块名;
下面给出为上面创立的minmax.DLL库写的输入单元源文件testdll .pas,从中可看出输入单元 与通常
单元的一些不一样,代码如下所示:
以下是引证片段:
unit testdll;
interface
uses
function Min (X, Y: Integer): Integer;
function Max (X, Y: Integer): Integer;
implementation
function Min; external ‘minmax.DLL’;
function Max; external ‘minmax.DLL’;
end.
一个运用程序若想调用minmax.DLL中的函数,只须在其uses句子中参加testdll 单元即可。
动态装入DLL,要用到Windows的三个API函数。Loadlibrary、Freelibrary和GetprocAddress
。loadlibrary函数用来装入DLL库,其调用格局如下:
function loadlobrary (DLLfileName:Pchar): THandle:
当不再需求一个DLL库时,应调用FreeLibrary函数将其开释,以空出名贵的内存资本,其调用格局如下:
procedure FreeLibrary (Libmodule:THandle)
Libmodule 为由LoadLibrary调用得到的DLL库句柄。在用loadlobrary
函数装入某个DLL库和调用FreeLibrary开释该DLL库之间的程序段中,
能够运用该DLL库中的进程和函数,具体运用方法是:用GetprocAddress函数把DLL库中函数的地址传递给程序中某个函数变量,再用该变量完成DLL函数的调用。GetprocAddress函数声名如下,
以下是引证片段:
function GetprocAddress (Libmodule:THandle:procname:pchar):TFarProc:
如下例所示:
type
TTimeRec = record
Second: Integer;
Minute: Integer;
Hour: Integer;
end;
TGetTime = procedure(var Time: TTimeRec);
THandle = Integer;
var
Time: TTimeRec;
Handle: THandle;
GetTime: TGetTime;
..
begin
Handle := LoadLibrary('DATETIME.DLL');
if Handle <> 0 then
begin
@GetTime := GetProcAddress(Handle, 'GetTime');
if @GetTime <> nil then
begin
GetTime(Time);
with Time do
WriteLn('The time is ', Hour, ':', Minute, ':', Second);
end;
FreeLibrary(Handle);
end;
end;
在调用动态链接库时应留意, 所需动态链接库须与运用程序在同一目录或Windows System 目录下。
动态链接库是 Windows下程序安排的一种主要方法,运用动态链接库能够极大地维护用户在不一样开发工具、不一同期所做的作业,进步编程功率。





优质IT资源分享社区为你提供此文。
本站有大量优质Delphi教程视频,资料等资源,包含Delphi基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。
Delphi教程视频
优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

微信小程序开发

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客