DLL:
library testCallBack;
uses
  SysUtils,
  Classes;{$R *.res}
type Tcallback = procedure(a:integer) of object;      //1 dll中定义的回调步骤
var CallBack: TCallBack;                              //2 dll中定义的回调步骤function Call(var a:integer;CallBack: TCallBack):integer;stdcall;      //3 dll中定义的回调步骤  应用程序调用这个函数,也是通过CallBack参数把应用程序中的回调函数实例地址传到dll 中;
var i,j: integer;
begin
  j:=0;
  for i:=0 to 100 do
  begin
    j:= j+ 1;
    CallBack(j);                                                       //4 dll中定义的回调步骤  此函数是在客户端定义的,实际上是调用客户端的程序
  end;
  result:=j;
end;exports                                                                //输出CAll函数
 Call;
end.EXE:

unit Unit2;interface
  type Tcallback = procedure(a:integer) of object;   //1应用程序定义回调函数  要加上 “of object”否则会出现 “regular procedure and method pointer“  错误    //1 dll函数的定义   sedcall一定要加否则找不到dll的接口地址
  function Call(var a:integer; CallBack:TCallBack):integer;Stdcall;    //2应用程序定义回调函数  引用了回调变量
implementation
    //2 dll函数的引用
    //函数名 一定要和dll中函数大小写相同,否则出错
  function Call; external 'testCallBack.dll' name 'Call' ;
end.
2unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Sockets, StdCtrls,Unit2;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure TestCallBack(a:integer);  //3应用程序定义回调函数  定义一个回调函数实例 参数要同dll中定义的回调函数相同
  end;var
  Form1: TForm1;implementation
{$R *.dfm}
procedure TForm1.TestCallBack(a: integer);
begin
  Memo1.Lines.Add(inttostr(a));
end;procedure TForm1.Button1Click(Sender: TObject);
var
  a :integer;
begin
  Call(a,TestCallBack);                     //4应用程序定义回调函数
end;end.