花褪残红青杏小。燕子飞时,绿水人家绕。

delphi之调用外部dll中的函数

菜鸟编程 十五楼的鸟儿 31571浏览 0评论
分早绑定和晚绑定两种。
早绑定的代码如下:
[code=delphi]
unit Unit1;

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;

var
Form1: TForm1;

//MB 函数的声明:
function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;

implementation

{$R *.dfm}
{调用外部 DLL 中的函数,譬如调用系统 user32.dll 中的 MessageBoxA}
//function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;
// stdcall; external user32 name 'MessageBoxA';

{其中 user32 是 Delphi 定义的常量 'user32.dll',可以直接写成:}
//function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;
// stdcall; external 'user32.dll' name 'MessageBoxA';

{name 后面说明函数的真实名字}
{external 子句说明单元载入时就加载函数,也就是早绑定;如果晚绑定需要用 LoadLibrary}
{stdcall 指令表示参数传递是从右到左(Pascal则反之),不通过CPU寄存器传递}

{4个参数的数据类型可以使用对应的 Delphi 数据类型,譬如:}
//function MB(hWnd: LongWord; lpText, lpCaption: PChar; uType: LongWord): Integer;
// stdcall; external 'user32.dll' name 'MessageBoxA';

{或者是:}
//function MB(hWnd: Cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer;
// stdcall; external 'user32.dll' name 'MessageBoxA';

{如果函数在此单元声明后,需要给其他单元调用,需要先在 interface 区声明:}
//function MB(hWnd: Cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer;
// stdcall;
{本例已经这样做了,如果要测试其他几种情况,需要先注释掉它}
{然后在 implementation 区,说明函数的来源:}
function MB; external 'user32.dll' name 'MessageBoxA';

//调用测试:
procedure TForm1.Button1Click(Sender: TObject);
var
t,b: PChar;
begin
t := '标题';
b := '内容';
MB(0,b,t,0);
end;

end.[/code]
晚绑定的例子:
[code=delphi]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
//晚绑定,也就是动态调用外部函数主要用以下三个命令:
//LoadLibrary:获取 DLL
//GetProcAddress:获取函数
//FreeLibrary:释放

//定义一个过程类型,参数要和需要的函数一致
TMB = function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
MB: TMB; {声明函数 MB}
inst: LongWord; {声明一个变量来记录要使用的 DLL 句柄}
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
inst := LoadLibrary('user32.dll');
if inst <> 0 then
MB := GetProcAddress(inst, 'MessageBoxW');
// MB := GetProcAddress(inst, 'MessageBoxA'); {Delphi 2009 之前的版本用这句}
end;

//调用测试:
procedure TForm1.Button1Click(Sender: TObject);
var
t,b: PChar;
begin
t := '标题';
b := '内容';
MB(0, b, t, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeLibrary(inst); {记得释放}
end;

end.[/code]
创建并调用dll
[code=delphi]
//通过 DLL Wizard 建立:
library TestDLL;

uses
SysUtils,
Classes,
Dialogs;

{$R *.res}

//建立过程
procedure Test;
begin
ShowMessage('TestDLL.Test');
end;

//输出
exports
Test;

begin
end.


//在其他工程调用,如果不在一个工程组,需要在相同目录下、System32下或指定路径;
//声明可以在实现区或接口区,这里的函数名要一致,甚至大小写。

//调用测试:
procedure Test; external 'TestDLL.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
Test;
end;[/code]

转载请注明:鸟儿博客 » delphi之调用外部dll中的函数

游客
发表我的评论 换个身份
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址