C++编写的DLL中其中有个这样的函数:
int test( unsigned char * pMsg, int * len);我在DELPHI里调用时写的对应原型是:
function test(pMsg:PChar; len:Integer):Integer; stdcall; far; external NAME_DLL name 'test';调用体如下:
procedure TForm1.Button3Click(Sender: TObject);
var
  ret, mLen: Integer;
  sMsg: array[1..193] of Char; //
 // pName, pGender, pFolk, pBirthDay, pCode, pAddress, pAgency, pExpireStart, pExpireEnd: PChar;
begin
  
  ret:=test(sMsg,0);
  if ret <> 1 then
  begin
    ShowMessage('信息读取失败');
    Exit;
  end;
  Memo1.Lines.Add(sMsg);
end;怎么MEMO1里显示的是乱码?

解决方案 »

  1.   

    len:Integer 改为len: PInteger
      

  2.   

    sMsg: array[1..193] of Char; 
    改为array[0..192] of Char; 试试
      

  3.   

    int * len -> PInteger
      

  4.   

    首先,SuperTitan001说的是对的,实际上你输出的函数不是stdcall,而是cdecl;
    function test(pMsg:PChar; var len:Integer):Integer; cdecl; external NAME_DLL name 'test'; 
    否则在C++中改变定义:extern "C" int __stdcall test( unsigned char * pMsg, int * len); 
      

  5.   

    function test(pMsg:PChar; len:PInteger):Integer; cdecl; external NAME_DLL name 'test'; 调用体如下: 
    procedure TForm1.Button3Click(Sender: TObject); 
    var 
      ret, mLen: Integer; 
      sMsg: array[0..192] of Char; 
    begin
      mlen=193; 
      zeromemory(@smsg[0],mlen);
      ret:=test(sMsg,@mlen); 
      if ret <> 1 then 
      begin 
        ShowMessage('信息读取失败'); 
        Exit; 
      end; 
      Memo1.Lines.Add(strpas(sMsg)); 
    end;