厂家提供了一个DLL,我写了一个回调函数去得到返回的值,但是无法把回调函数的值返回到我的程序里的一个公用变量里,请问应该如何实现。
我是这样写的:
PUBLIC
  v_sStr: string;procedure form.buttonOnclick(sender: TOBJECT)
var
  procedure InsertDb(v_sPhone, v_sRecvaddi, v_sContext, v_sTime: string);
  begin
    在这里得到的一些值需要返回来,但是不知道怎么得到。
    比如:
    v_sStr := 值;  这样出错,v_sStr是全局变量。
  end;
  procedure GetInfo(mobile, senderaddi, recvaddi, ct,sd:PChar; flag:Pointer);stdcall;
  begin
    ………………………………………………
    ………………………………………………
    InsertDb(v_sPhone, v_sRecvaddi, v_sContext, v_sTime)
  end;
begin
  resultStatus := _ReceiveSMSEx(PChar(CST_sSN),@GetInfo);
end;

解决方案 »

  1.   

    你做什么要搞过程嵌套呢, 还有把_ReceiveSMSEx函数原形贴出来看看.
    照这样改看行不行procedure InsertDb(v_sPhone, v_sRecvaddi, v_sContext, v_sTime: string);v_sStr: string;implementationprocedure InsertDb(v_sPhone, v_sRecvaddi, v_sContext, v_sTime: string);
      begin
        在这里得到的一些值需要返回来,但是不知道怎么得到。
        比如:
        v_sStr := 值;  这样出错,v_sStr是全局变量。
      end;procedure GetInfo(mobile, senderaddi, recvaddi, ct,sd:PChar; flag:Pointer);stdcall;
      begin
        ………………………………………………
        ………………………………………………
        InsertDb(v_sPhone, v_sRecvaddi, v_sContext, v_sTime)
    end;procedure form.buttonOnclick(sender: TOBJECT)
    begin
      resultStatus := _ReceiveSMSEx(PChar(CST_sSN),@GetInfo);
    end;***********************************
     高级群号:16497064欢迎编程高手加入.
    *********************************** 
      

  2.   

    忘了把下面这行
    procedure GetInfo(mobile, senderaddi, recvaddi, ct,sd:PChar; flag:Pointer);stdcall;
    也在放在接口节;
    ***********************************
     高级群号:16497064欢迎编程高手加入.
    ***********************************
      

  3.   

    照你说的改了,编译过不去,
    resultStatus := _ReceiveSMSEx(PChar(CST_sSN),@GetInfo);停在了这里,感觉好象是少了点什么。
      

  4.   

    你的_ReceiveSMSEx函数的API接口都没有在接口去声明当然编译不过去.
      

  5.   

    什么意思,不大明白还是。_ReceiveSMSEx是DLL里提供的方法。
    function _ReceiveSMSEx(sn: PChar; func: Pointer): integer;stdcall; external 'EUCPComm.dll' name 'ReceiveSMSEx';
    已经声明了。我在当前单元的上面加了
    TYPE
      THDProcedure = procedure(mobile, senderaddi, recvaddi, ct,sd:PChar; flag:Pointer); stdcall;可是还是有错,我已经开被这个东西搞晕了。
      

  6.   

    拜托你把错误信息贴上来好不好?你这么问,谁知道到底问题在哪里啊?!另外,resultStatus 必须是int的还有,你v_sStr: string;是string,赋个int当然出错!
      

  7.   

    那就再贴份详细点的。
    function _ReceiveSMSEx(sn: PChar; func: Pointer): integer;stdcall; external 'EUCPComm.dll' name 'ReceiveSMSEx';   //在别单元声明的。private
      ………………………………………………
      v_sStr: string;
      function GetSmsContext(AThread: TIdPeerThread): boolean;
      procedure GetInfo(mobile, senderaddi, recvaddi, ct,sd:PChar; flag:Pointer);stdcall;
      procedure InsertDb(v_sPhone, v_sRecvaddi, v_sContext, v_sTime: string);
      ……………………………………………………………………function TfrmMain.GetSmsContext(AThread: TIdPeerThread): boolean;
    var
      resultStatus: integer;
    begin
      resultStatus := _ReceiveSMSEx(PChar(CST_sSN),@GetInfo); //编译时出错, 提示信息“variable required。”
      if resultStatus = 2 then
        result := true
      else
        result := false;
    end;
    procedure TfrmMain.InsertDb(v_sPhone, v_sRecvaddi, v_sContext,
      v_sTime: string);
    begin
      当然就是插入数据库了,
      但是在这里插入后,我需要把几个值传出来。
      v_sStr := 值;
    end;procedure TfrmMain.GetInfo(mobile, senderaddi, recvaddi, ct, sd: PChar;
      flag: Pointer);
    var
      v_sPhone, v_sRecvaddi, v_sContext, v_sTime
    begin
        ……………………………………
        InsertDb(v_sPhone, v_sRecvaddi, v_sContext, v_sTime);
    end;调用:GetSmsContext(AThread)函数,传入一个线程进去。
      

  8.   

    出错的原因应该是它需要一个变量,而你传了const你不要直接传PChar(CST_sSN),先说明一个pchar变量,中转一下
      

  9.   

    procedure TfrmMain.InsertDb(v_sPhone, v_sRecvaddi, v_sContext,
      v_sTime: string);
    begin
      当然就是插入数据库了,
      但是在这里插入后,我需要把几个值传出来。
      v_sStr := 值;
    end;对啊,你直接赋值不就可以了?不要说你刚学delphi几个小时!