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

delphi编写的dll,pb调用返回乱码,该怎么解决

2012-02-10 
delphi编写的dll,pb调用返回乱码以下是我delphi编写的dll,用Pchar输出library testDllusesWindows, Messa

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 类型第一个字节存放的是该字符的长度,应该会偏移一位;






热点排行