dll代码如下:
function keyselect(v1:PChar;klen:PInteger):PChar;stdcall;
var v2:PChar;len:Integer;
    s,s1,re:String;
    Con:TSocketConnection ;
    F:textfile;
    Ds:Tclientdataset;
   // i,ilen:Integer;
begin
  Con := Tsocketconnection.Create(nil);
  ds  := TClientDataset.Create(nil);
  AssignFile(F, GetCurrentDir + '\ApServer.cfg');
  try
    Reset(F);
    Readln(F, S);
    con.Port := 211 ;
    con.ServerGUID := '{AF550BF4-3BA4-415D-B1F3-E2F7C8ADE30C}';
    con.ServerName := 'SajetApserver.RMDB';
    con.Address := trim(s);
    con.Connected :=true;
    ds.ProviderName := 'DspQryData';
    ds.RemoteServer := con;
    ds.Close;
    s1:=StrPas(v1);
    len:=length(s1);
    ds.CommandText:='select serial_number from sajet.g_sn_keyparts where item_part_sn='''+s1+'''';
    //ShowMessage(Ds.CommandText);
    ds.Open;
    if ds.RecordCount=0 then begin
    s1:='NO SN';
    len:=Length(s1);
    StrCopy(v1,PChar(s1));
    kLen^ := Len;
    result:='NO SN';
    end
    else  begin
    s1:=ds.FieldValues['serial_number'];
    len:=Length(s1);
    StrCopy(v1,PChar(s1));
    kLen^ := Len;
    Result:=PChar(s1);
    //Result:='Finad SN';
    end;
  finally
   CloseFile(F);
   con.Free;
   ds.Free;
  end;
dll其他语言调用乱码,而使用delphi调用即使不执行函数,把程序打开直接关闭也会报错,这是为什么,调用代码如下:
function keyselect(buf:PChar;PLen:PInteger):pchar;stdcall ;external 'link.Dll' ;
procedure TForm2.btn1Click(Sender: TObject);
var s :string;
    Len:integer;begin
      //sn1
    s :=edt1.Text+'01';
    Len := Length(s);
    GetMem(buf,100);
    StrCopy(buf,PChar(s));
    keyselect(buf,@Len);
    //接收返回数据
    s := '';
    s := StrPas(buf);
    //s := Copy(s,1,Len);
    Edt2.Text := s ;
    FreeMem(buf);

解决方案 »

  1.   

    keyselect(buf,@Len);
    改为keyselect(@buf,Len);
      

  2.   

    Result:=PChar(s1);
    --------------
    不要这样干
    返回一段内存最后使用
      

  3.   

    返回一段内存最好使用 出参,比如
    fun(var outbuf: pointer; var bufsize: integer);另外,你的delphi是什么版本2009及以后的版本是unicocde,最好是用pansichar
      

  4.   

      就得与几个问题! 入参有问题
    这个变量  Len:integer;应该修改:  Len: Pinteger;然后new(Len); 赋值:Len^ := Length(s);调用就是: keyselect(buf,Len); dispose(Len); 返回后记得释放啊返回指针不能使用局部变量,最好truexf 给你的方法吧   
      

  5.   

    如果你返回了内存块,那么你还有提供一个FreeMem的导出函数,返回的buf要有这个freemem函数来释放。
    为什么呢,因为delphi的内存管理器和其他语言的内存管理是不同的。
    不然就不要返回内存块,而由调用者提供一段内存给你装返回值