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