Delphi动态连接库的编写和调用
一、dll的优点
Dll是windows中的一种重要机制。它包括例程和资源,可以在使用程序之间共享例程和资源。其优点是:扩展应用程序的特性、可以使用多种语言来编写、简化
了软件项目的管理、有助于节约内存、帮助实现平台的跨越和本地化等。
二、dll在delphi中的建立
在delphi中新建->其他->选中Dll图标(Dll Wizard) 确定后可以看到一个简单的dll工程。
library Project1;
{这里还有很长的一段话}
uses
SysUtils,
Classes;
{$R *.res}
begin
end.
现在如果按Ctrl+F9 就会在你的保存目录下生成一个没有任何功能的dll。
现在我们来给它添加一点功能:
library Project1;
uses
SysUtils,
Classes;
Function MyMax(X,Y:Integer):Integer;stdcall; //必须添加stdcall说明调用方式
begin
if x>y then
Result:=x
else
Result:=y;
end;
exports //声明函数出口
MyMax;
begin
end.
现在Ctrl+F9,就生成一个具有比较大小功能的简单dll,这里可以去掉{$R *.res},如果要使生成的dll最小,那就尽量减少Uses中的应用,在这里可以全部删掉
。即:
library Project1;
uses
SysUtils,
Classes;
Function MyMax(X,Y:Integer):Integer;stdcall;
begin
if x>y then
Result:=x
else
Result:=y;
end;
exports MyMax;
begin
end.
这样生成的dll只有几K。
从这个dll中可以看出几点:一、dll工程的关键字是library 二、函数后面要加调用方式stdcall(这是为了和c &cpp兼容)三、要用exports 声明函数出口。
三、dll的调用
Delphi中有三种调用方式,在这里就给大家介绍两种比较常用的方式:
1、 Dll的静态引用
首先在程序的实现部分声明一下:
Function MyMax(X,Y:Integer):Integer;stdcall;external'Max.dll';
这里要说明调用方式,要用external说明dll的名字(可以是dll的路径和名称)。
然后在按钮事件中加入:
var
i:Integer;
j:integer;
begin
i:=StrToInt(Edit1.Text );
J:=StrToInt(Edit2.Text );
Edit3.text:=IntToStr(MyMax(i,j));
end;
现在就可以通过输入来比较大小了,这么没有使用异常处理,超出一定的范围会出现错误提示。
这里要注意的就是前面那个声明。
2.动态调用
首先介绍三个API函数
Function LoadLibrary(LibFileName: PChar):Thandle 引导指定的dll文件,获得Handle
Procedure FreeLibrary(LibModule:THandle) 释放dll
Function GetProcAddress(Module:Thandle; ProName: PChar):TfarPro 返回入口地址
现在我们在按钮事件中加入代码:
var
i:Integer;
j:integer;
//D:Integer;
TFc:Function (X,Y:Integer):Integer;stdcall; //这句话很重要,如果没有,下面不那个运行。
Handle:THandle;
begin
Handle:=LoadLibrary('Max.dll'); //get dll handle
if Handle>=32 then
TFc:= GetProcAddress(Handle,PChar('MyMax')); //get Proaddress
if Assigned(TFc) then // Assigned(TFc) 与 TFc <>0 是等价的
begin
i:=StrToInt(Edit1.Text );
J:=StrToInt(Edit2.Text );
// d:=TFc(i,j);
Edit3.text:=IntToStr(TFc(i,j));
end;
FreeLibrary(Handle); // free dll
end;
end.