现有一动态库abc.dll
VC++中的使用方法是
typedef struct {
char CS[16];
char index;
} SM_PARAM;
//声明
int RA_Message(SM_PARAM *sm_temp)//如此使用,没有任何问题
SM_PARAM *sm_temp=new SM_PARAM[30];
int temp=RA_Message(sm_temp);在Delphi中我如此使用
SMS=^SM_PARAM;
SM_PARAM=record
    CS   :Array[0..15] of char;  
    index:Array[0..2]  of char; 
end;
//声明
function RA_Message(sm_temp:SMS):Integer;stdcall;external 'abc.dll' name 'RA_Message';//使用
procedure TForm1.Button1Click(Sender: TObject);
 var sms1:array[0..10] of SMS;
     i,num:integer;
     s:String;     
begin
  for i:=0 to 10 do
    new(sms1[i]);  num:=RA_Message(@sms1);//跟踪时,此处已经通过,并且有正确的返回值。
  
  for k:=1 to num do
    begin
      s:=string(sms1[k].CS);//此处出错,地址无效,出现CPU调试窗口。
      Memo1.Lines.Add('内容:'+s);
    end;  for i:=0 to 10 do
    dispose(sms1[i]);
end;请问Delphi中该如何使用?
请赐教!

解决方案 »

  1.   

    type
      SMS = ^SM_PARAM;
      SM_PARAM = record
        CS: String[16];
     index: String[3];
    end;
      

  2.   

    ailibuli(愛理不理) 
    我改了,一样出错。
    是下面的写法不对吗?
    num:=RA_Message(@sms1);//跟踪时,此处已经通过,并且有正确的返回值。
      
      for k:=1 to num do
        begin
          s:=string(sms1[k].CS);//此处出错,地址无效,出现CPU调试窗口。
          Memo1.Lines.Add('内容:'+s);
        end;
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var myList: TList;
        sms1: SMS;
        i: integer;
    begin
      myList := TList.Create;
      try
        for i:=0 to 10 do begin
          new(sms1);
          sms1.CS := 'Name' + IntToStr(i);
          sms1.index := IntToStr(i);
          myList.Add(sms1);
        end;    i := 0;
        while i < myList.Count do begin
          sms1 := myList.Items[i];
          Memo1.Lines.Add('内容:'+ sms1.CS + '/' + sms1.index);
          inc(i);
        end;
      finally
        myList.Free;
      end;
    end;
    (注:存指针用TList比較好)
      

  4.   

    多谢ailibuli(愛理不理)的回复。num:=RA_Message(@sms1);//跟踪时,此处已经通过,并且有正确的返回值。
                           //sms1要是个数组。               
    怎么把你说的应用到我的问题上呢?
    不明白!
      

  5.   

    function RA_Message(sm_temp:SMS):Integer;
    ↑此処定義的参数形式是指针呀、不是指针数组!難到君要的是指针数组?function RA_Message(sm_temp:TList):Integer;
    num:=RA_Message(myList);
    ↑試試吧。
      

  6.   

    for k:=1 to num do
        begin
          s:=string(sms1[k].CS);//此处出错,地址无效,出现CPU调试窗口。
          Memo1.Lines.Add('内容:'+s);
        end;
    (還有:君的Source中、対"k"没做定義)
      

  7.   

    我只是截取一段代码,不全。现有一动态库abc.dll
    VC++中的使用方法是
    typedef struct {
    char CS[16];
    char index;
    } SM_PARAM;
    //声明
    int RA_Message(SM_PARAM *sm_temp)//使用,在VC中是正确的。
    SM_PARAM *sm_temp=new SM_PARAM[30];
    int temp=RA_Message(sm_temp);请把它该写成Delphi程序。对不起!我太弱。
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject);
    var sms1:array[0..10] of SMS;
        p: SMS;
        i,num:integer;
        s:String;
    begin
      for i:=0 to 10 do begin
        new(p);        //先New
        sms1[i] := p;  //後把Point放入数組
      end;
      num:=RA_Message(@sms1);
      {...}
    end;
    (其他同上,不知行不行?  算是帮UP吧...)
      

  9.   

    C++和DELPHI的结构内存存储方式不太一样,把SM_PARAM=record
        CS   :Array[0..15] of char;  
        index:Array[0..2]  of char; 
    end;
    改为
    SM_PARAM= packed record
        CS   :Array[0..15] of char;  
        index:Array[0..2]  of char; //char为什么改为char[3]
    end;
    不行的话再
    var sms1:array[0..10] of SMS;
    改为
    var sms1:packed array[0..10] of SMS;试试看吧,呵呵
      

  10.   

    SM_PARAM=record
        CS   :Array[0..15] of char;  
        index:Array[0..2]  of char; 
    end;改成
    SM_PARAM=packed record
        CS   :Array[0..15] of char;  
        index:Array[0..2]  of char; 
    end;
      

  11.   

    感谢各位的回复.下面是我的代码,运行通过,但是返回值有问题.VC中没有出错.SM_PARAM=record
        CS   :Array[0..15] of char;  
        index:Array[0..2]  of char; 
    end;
    //声明
    function RA_Message(sm_temp:array of SM_PARAM):Integer;stdcall;external 'abc.dll' name 'RA_Message';//使用
    procedure TForm1.Button1Click(Sender: TObject);
     var sms1:array[0..10] of SM_PARAM;
         i,num:integer;
         s:String;     
    begin
      num:=RA_Message(sms1);
      for k:=1 to num do
        begin
          Memo1.Lines.Add('编号:'+string(sms1[k].index));
          Memo1.Lines.Add('内容:'+string(sms1[k].CS));
        end;
    end;可以通过,只是sms1[k].CS的值有些不对.//编号错误,内容正确
    编号:888 
    内容:13888016901,您申请的密码:150174//编号错误,内容错误
    编号:珱
    内容:站??????????闻????闲????????愸?蔀?蜑蛙???偑?胉????鉻?蛶?????????駾飓//编号错误,内容错误
    编号:?
    内容:P挀能正确运行,但返回值不正确.请各位继续帮忙.谢谢!
      

  12.   

    估计就是packed的问题,为什么不试。
      

  13.   

    lijinghe1(副乡长) 
    我试了packed,效果一样。