delphi编写的dll,pb调用返回乱码
以下是我delphi编写的dll,用Pchar输出
library testDll;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, StdCtrls,ComObj;
{$R *.res}
function getComput(inputStr:pchar; out outStr:pchar):integer;stdcall;export;
begin
try
outstr := AllocMem(255);
strcopy(outstr,'woshizhong');
result := 0;
showmessage(outstr) ;
finally
FreeMem(outstr);
end;
end;
exports
getComput;
begin
end.
pb声明:
function integer getComput(string inputStr, ref String outStr) LIBRARY "testDll.dll"
pb调用:
string ls_outstr
integer li_net
ls_outstr = space(256)
li_net = getComput('oooo',ls_outstr)
messagebox(string(li_net), ls_outstr)
出现乱码,如delphi用shortstring输出,则不会,但是会偏移位
[解决办法]
改为调用时分配内存,不是在dll里面分配,修饰词Out不要;
function getComput(inputStr:pchar; outStr:pchar):integer;stdcall;export;
begin
strcopy(outstr,inputStr);
result := 100;
end;
delphi调用,PB的自己改一下:
var
k:integer;
P:pchar;
begin
p:=stralloc(1024);
try
k:=getComput('测试',P);
showmessage(Inttostr(k)+','+P);//返回'100,测试'
finally
strdispose(p);
end;
end;
[解决办法]
以下是我delphi编写的dll,用Pchar输出
library testDll;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, StdCtrls,ComObj;
{$R *.res}
function getComput(inputStr:pchar; out outStr:pchar):integer;stdcall;export;
begin
try
outstr := AllocMem(255);
strcopy(outstr,'woshizhong');
result := 0;
showmessage(outstr) ;
finally
FreeMem(outstr);
end;
end;
exports
getComput;
begin
end.
pb声明:
function integer getComput(string inputStr, ref String outStr) LIBRARY "testDll.dll"
pb调用:
string ls_outstr
integer li_net
ls_outstr = space(256)
li_net = getComput('oooo',ls_outstr)
messagebox(string(li_net), ls_outstr)
出现乱码,如delphi用shortstring输出,则不会,但是会偏移位
第一delphi的定义应该是:
function getComput(inputStr:pchar; outStr:pchar):integer;stdcall;export;
var
vString: String;
begin
try
vString := 'woshizhong';
move(PChar(vString)^, outstr^, length(vString));
result := 0;
except
result := -1;
end;
exports
getComput;
begin
end.
第二、PB调用就是按你写的就可以了
第三、如delphi用shortstring输出,则不会,但是会偏移位
这是因为shortstring 类型第一个字节存放的是该字符的长度,应该会偏移一位;