首页 > 代码库 > Delphi编写DLL(以及静态和动态方式调用)
Delphi编写DLL(以及静态和动态方式调用)
Delphi编写DLL(以及静态和动态方式调用)
作者/cadenza7
什么是DLL?
DLL是Dynamic Link Library(动态链接库)的缩写形式。DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件,动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数,函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源,多个应用程序可同时访问内存中单个DLL 副本的内容,DLL 是一个包含可由多个程序同时使用的代码和数据的库。
Delphi编写DLL
SysUtils,
Classes;
{$R *.res}
//function MySquare(num:integer):integer;
//加上stdcall表示此DLL文件可以供除Delphi以外程序调用,比如VB、C++等等
//函数MySquare()用于计算一个整数的平方
function MySquare(num:integer):integer;stdcall;
begin
Result:=num*num;
end;
exports
//输出MySquare()函数,必须输出,否则在程序中调用时会提示"无法找到此函数的入口点"
MySquare;
begin
end.
静态加载方式调用DLL
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//静态调用
function MySquare(i:integer):integer; stdcall; external ‘MyDLL.dll‘;
//静态调用使用别名方式
function MyAsSqr(i:integer):integer; stdcall; external ‘MyDLL.dll‘ name ‘MySquare‘;
var
Form1: TForm1;
//静态调用时也可以定义在这里
//function MySquare(i:integer):integer; stdcall; external ‘MyDLL.dll‘;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(MySquare(5)));
ShowMessage(IntToStr(MyAsSqr(6)));
end;
end.
动态加载方式调用DLL
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
//Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//动态调用
TMySquare = function(i:integer):integer; stdcall;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
num: integer;
HndDLL: THandle;
//为便于演示代码,此处使用Func来命名
Func: TMySquare;
//实际开发中我更习惯使用此方式命名
//MySquare: TMySquare;
begin
HndDLL := LoadLibrary(‘MyDLL.dll‘);
try
//注意‘MySquare‘为DLL中的原始名称
@Func := GetProcAddress(HndDLL, ‘MySquare‘);
//@MySquare:= GetProcAddress(HndDLL, ‘MySquare‘);
if Assigned(@Func) then
//if not (@Func=nil) then
begin
num := Func(7);
ShowMessage(IntToStr(num)) ;
//self.Memo1.Lines.Add(IntToStr(num));
end;
finally
FreeLibrary(HndDLL);
end;
end;
end.
http://blog.csdn.net/cadenza7/article/details/6318103#
静态加载:简单方便。
动态加载:相对复杂一些,需要显示地获取函数调用地址,但比较灵活,对于不常用的代码,使用时LoadLibrary,不用时FreeLibrary,不必长时间占用内存资源。