PB调用delphi的DLL时传字符串出现乱码

equn93 2008-10-06 05:14:32
delphi中的DLL函数如下:
function Test(var Str: PChar): PChar; stdcall;
begin
Str:= PChar('This is Test');
Result:= Str;
end;

用delphi调用正常,如下:
var
s1,s2: PChar;
begin
s1:= Test(s2);
ShowMessage('s1:' + s1 + ' s2:' + s2);//结果正确's1:=This is Test s2:= This is Test'
end;

用PB调用:
定义 function string Test(ref string Str) library 'myDLL.dll'
调用
string s1,s2
s1=Test(s2)
messagebox('info','s1:' + s1 + ' s2:' + s2)//结果s1能正常显示,s2却显示乱码.

请各位大虾指点,这是什么原因,要如何修改?
...全文
566 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jwei0791 2011-04-21
  • 打赏
  • 举报
回复
ddd
equn93 2008-10-07
  • 打赏
  • 举报
回复
多谢孒淵兄了.. 问题已解决.
僵哥 2008-10-07
  • 打赏
  • 举报
回复
Delphi是什么版本?不会是Delphi2009吧?
equn93 2008-10-07
  • 打赏
  • 举报
回复
多谢孒淵和僵哥的讲解,不过我按照你们的写法去做,在PB中得到的还是乱码,问题仍然没有得到解决.
五维思考 2008-10-07
  • 打赏
  • 举报
回复
僵哥在7楼的发言让我很受教,待我慢慢消化
僵哥 2008-10-06
  • 打赏
  • 举报
回复
function Test(Src: PChar;srcLen: Integer;Buffer: PChar;var Size: Integer): boolean; stdcall;
begin
Result := false;

//最好对指针类必须的参数做一个检查
//Assert(Src <> Nil);

//Buffer为NULL时,表示仅取数据大小填充Size
//当Buffer不足时,通知Size告知实际需求的内容大小,并设置LastError为ERROR_MORE_DATA
//注意:在通常情况下,只有处理过程完成才会知道实际所须的空间大小,而在此前是无法预知的
//如果仅只传递一个大小回去,就要做完一遍,然后在取数据的时候还需要再做一遍,明显存在设计上的缺陷
//最好的办法是考虑使用临时存储所需的信息,以在处理完一遍之后能够直接获取信息.
//或者在调用环境支持回调的情况下,增加一个写出回调过程作为参数传进来

if (Buffer = Nil) or (Size < srcLen) then begin
SetLastError(Byte(Buffer <> Nil) * 234 (*ERROR_MORE_DATA, need more buffer size*) );
Size := srcLen;
Exit;
end;

//正常处理
Move(Src^, Buffer^, srcLen);
Size := srcLen;
Result := true;

end;
五维思考 2008-10-06
  • 打赏
  • 举报
回复
僵哥说得很对,只是楼主没有理解其含义,我用代码来帮着解释一下吧,你的DLL函数改一下

function Test(Str,RValue: PChar): Integer; stdcall; 
begin
Str:= PChar('This is Test');
StrCopy(RValue,Str);
Result:= Length(RValue);
end;

//如果函数里用String类型则:
function Test(Str,RValue: PChar): Integer; stdcall;
var S:String;
begin
S:='This is Test'+Str;
StrPCopy(RValue,S);
Result:= Length(S);
end;


以上的两个例子中RValue就是你想要传给PB的值
equn93 2008-10-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 unsigned 的回复:]
1.不要试图在function当中返回pchar,内存管理逻辑问题
2.参数当中即使是想返回内容,也最好使用一个pchar就好,不需要再使用var,数据可以move操作.
3.对于使用如pchar等无法明确内容大小的参数时,请多加一个描述内容大小的参数
4.如果确实需要返回信息,建议使用出参,并建议多增加一个参数用于表示内存长度(调用时)和内容长度(调用返回后).
[/Quote]
1.DLL传字符串给PB好像只能用PChar.
2.这一点我明白了.
3.这点是否要手动分配内存?
4.返回信息是肯定要的,如果不用出参,而用传址的方式传递参数,这样可行吗,要注意什么?
最后请僵哥就我的那个小测试程序提点修改意见,要保证在PB中调用时实参值(S2)和返回值(S1)都不是乱码.
僵哥 2008-10-06
  • 打赏
  • 举报
回复
1.不要试图在function当中返回pchar,内存管理逻辑问题
2.参数当中即使是想返回内容,也最好使用一个pchar就好,不需要再使用var,数据可以move操作.
3.对于使用如pchar等无法明确内容大小的参数时,请多加一个描述内容大小的参数
4.如果确实需要返回信息,建议使用出参,并建议多增加一个参数用于表示内存长度(调用时)和内容长度(调用返回后).
jerry8 2008-10-06
  • 打赏
  • 举报
回复
楼主是车诚俊?
ly_liuyang 2008-10-06
  • 打赏
  • 举报
回复
当然~用法不正确
PANSICHAR是指针,不能随便用隐含转换的
具体别人来说好了~
suton 2008-10-06
  • 打赏
  • 举报
回复
pb里面没有pchar(Delphi) 或 char *(C/C++)这样的类型吗?

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧