dll是用vc写的。其接口函数如下:
int _stdacll ReceiveSMEX(bool *IsReprot,Char* Source, Int *iLen,Char* MsgCon,Char* MsgID,int *Stat,Char *Dest)delphi调用的过程如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;type
   TRecvSm=function (IsReport:boolean;Src:pchar;iLen:integer;
                SmCon,MsgID:pchar;State:Integer;Dest:pchar):integer;stdcall;
  TForm1 = class(TForm)
    btn_Login: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    RecvTimer: TTimer;
    procedure btn_LoginClick(Sender: TObject);
    procedure RecvTimerTimer(Sender: TObject);
    private
    { Private declarations }
    SrvIP:array[0..31] of char;
    UserName:array[0..15] of char;
    Pwd:array[0..31] of char;
    Handle:THandle;
    RecvSm:TRecvSm;
  public
    { Public declarations }
    procedure AddMsgToMemo(str:string);
  end;var
  Form1: TForm1;
  function Login(Const SvcIP:pchar;Port:integer;Const   UserName,Pwd:pchar):integer;stdcall;external 'Client.dll';
implementation
{$R *.dfm}procedure TForm1.AddMsgToMemo(str: string);
begin
    Memo1.Lines.Add(str+#10#13);
end;procedure TForm1.btn_LoginClick(Sender: TObject);
begin
    SrvIp :='192.168.16.12';
    UserName :='cl';
    Pwd :='cl888';
    Edit1.Text := IntToStr(Login(SrvIp,47271,UserName,Pwd));
    Handle := LoadLibrary('Client.dll');
    if Handle<>0 then
    begin
        @RecvSm := GetProcAddress(Handle,'ReceiveSMEx');
        if @RecvSM<>nil then
        begin
            AddMsgToMemo('载入接收动态链接库成功');
            RecvTimer.Enabled := True;
       end
        else
        begin
            FreeLibrary(Handle);
            AddMsgToMemo('载入接收动态链接库失败');
        end;
    end;
end;procedure TForm1.RecvTimerTimer(Sender: TObject);
var
    IsReport:Boolean;
    Src:array [0..20] of char;
    Dest: array[0..20] of char;
    iLen,Stat,GateID,iRecv:integer;
    MsgCon: array [0..256] of char;
    MsgID: array[0..8] of char;
begin
    RecvTimer.Enabled := False;    ZeroMemory(@Src,sizeof(SrcPhone));
    ZeroMemory(@Dest,sizeof(DestPhone));
    ZeroMemory(@MsgCon,sizeof(MsgCon));
    ZeroMemory(@MsgID,sizeof(MsgID));
    {iRecv := RecvSm(IsReport,Src,iLen,MsgCon,MsgID,Stat,Dest);
    case iRecv of
      0:  begin
                AddMsgToMemo('数据接受成功');          end;
      1:  begin
          end;
      2:  AddMsgToMemo('用户尚未登陆');
      3:  AddMsgToMemo('接收参数错误');
      4:  AddMsgToMemo('网络连接失败');
    end;                         }
    RecvTimer.Enabled := True;end;end.问题如下:当接收数据完成之后,程序就报出地址错误。
各位大虾请帮忙看看上述调用的问题

解决方案 »

  1.   

    你看看这样可否定义
    TRecvSm = function (IsReport:PBoolean;Src:pchar;iLen:Pinteger;
                    SmCon,MsgID:pchar;State:PInteger;Dest:pchar):integer;stdcall;procedure TForm1.RecvTimerTimer(Sender: TObject);
    var
        IsReport:PBoolean;
        Src:array [0..20] of char;
        Dest: array[0..20] of char;
        iLen,Stat,GateID,iRecv:Pinteger;
        MsgCon: array [0..256] of char;
        MsgID: array[0..8] of char;
    begin
        getMem(IsReport, sizeof(boolean));
        getMem(iLen, sizeof(integer));
        getMem(Stat, sizeof(integer));
        getMem(GateID, sizeof(integer));
        getMem(iRecv, sizeof(integer));
        RecvTimer.Enabled := False;    ZeroMemory(IsReport,sizeof(boolean));
        ZeroMemory(iLen,sizeof(integer));
        ZeroMemory(Stat,sizeof(integer));
        ZeroMemory(GateID,sizeof(integer));
        ZeroMemory(iRecv,sizeof(integer));    
       {iRecv := RecvSm(IsReport,Src,iLen,MsgCon,MsgID,Stat,Dest);
        case iRecv of
          0:  begin
                    AddMsgToMemo('数据接受成功' + intToStr(MsgID^));          end;
          1:  begin
              end;
          2:  AddMsgToMemo('用户尚未登陆');
          3:  AddMsgToMemo('接收参数错误');
          4:  AddMsgToMemo('网络连接失败');
        end;                         }
        RecvTimer.Enabled := True;end;
      

  2.   

    谢谢 hotzhu,你提供的方法果然可以。
      

  3.   

    注意使用extern "C"在VC中导出函数,
    调用约定使用stdcall