调用外部 DLL 中的函数(1. 早绑定)


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.


 
   

你可能感兴趣的:(dll)