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 函数的声明: 在接口段声明出要调用的dll的函数 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.