首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

dll其余语言调用乱码,delphi调用报无效的指针操作

2013-06-26 
dll其他语言调用乱码,delphi调用报无效的指针操作dll代码如下:function keyselect(v1:PCharklen:PInteger

dll其他语言调用乱码,delphi调用报无效的指针操作
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);
[解决办法]
返回一段内存最好使用 出参,比如


fun(var outbuf: pointer; var bufsize: integer);

另外,你的delphi是什么版本2009及以后的版本是unicocde,最好是用pansichar

热点排行