做了一个测试,把函数指针作为参数来用 
 
  TOnMessage = procedure(Value: PChar) of object; stdcall;
  POnMessage  = ^TOnMessage;  
  procedure OnProcessMessage(Value: PChar);
  begin
   ShowMessage(Value);
  end;
  //测试
  procedure Button1Click()
  var
   Address: POnMessage;
  begin
   Address:= @OnProcessMessage;
   Address^('ok');//报内存错
  end;
  
  如上,当访问Address^('ok')时报内存访问错误

解决方案 »

  1.   

    Address('ok');//这样就可以了。..
      

  2.   

    TOnMessage本来就是指针啊
    还要POnMessage干什么?
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
     Address: TOnMessage;
    begin
     @Address := @OnProcessMessage;
     Address('OK');
    end;
      

  4.   

    因为你的OnProcessMessage没有定义在类中,没有Self参数,所以定义中应该去掉of Object  TOnMessage = procedure(Value: PChar){ of object;} stdcall;
    //  POnMessage  = ^TOnMessage;  
      procedure OnProcessMessage(Value: PChar); stdcall; //这里加上stdcall
      begin
       ShowMessage(Value);
      end;
      //测试
      procedure Button1Click()
      var
       Address: TOnMessage;
      begin
       Address := @OnProcessMessage;
       Address('ok');
      end;
      

  5.   

    加上 "TFORM." 因为,你用了OBJECT
      

  6.   

    晕怎么还不结帖呢!!!  TOnMessage = procedure(Value: PChar) of object; stdcall;
      //以上是你用了of object; stdcall;所以在以下。就得
      POnMessage  = ^TOnMessage;  
      procedure TForm1.OnProcessMessage(Value: PChar);
      begin
       ShowMessage(Value);
      end;
      //测试
      procedure TForm1.Button1Click()
      var
       Address: POnMessage;
      begin
       Address:= @TForm1.OnProcessMessage;
       //所以要上加的“TFORM1”,如果你在以上没有OF object的话就不用这样。。
       Address^('ok');//报内存错
      end;