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);
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);
解决方案 »
- 关于窗口显示的问题
- 在线等候解答:Delphi中的string[10] 对应C++Builder的什么含义?
- 向数据表插入数据时的问题!
- table1.InsertRecord和table1.SetFields能否直接用SQL语句替代??????
- jackie168(玉面書生) 先进来拿分!⑤
- MASKEDIT求救
- 140给他(她),谁帮我解决这个问题!!!今天6点前结帐。
- Some questions about a project
- Excel VBA问题:请问如何在单元格中插入:页号、本页小计、合计?
- DELPHI SQL 二进制流读取存储图片出现错误
- C#代码转化delphi
- com1 com2 通信的问题
改为keyselect(@buf,Len);
--------------
不要这样干
返回一段内存最后使用
fun(var outbuf: pointer; var bufsize: integer);另外,你的delphi是什么版本2009及以后的版本是unicocde,最好是用pansichar
这个变量 Len:integer;应该修改: Len: Pinteger;然后new(Len); 赋值:Len^ := Length(s);调用就是: keyselect(buf,Len); dispose(Len); 返回后记得释放啊返回指针不能使用局部变量,最好truexf 给你的方法吧
为什么呢,因为delphi的内存管理器和其他语言的内存管理是不同的。
不然就不要返回内存块,而由调用者提供一段内存给你装返回值