关于 Dll 返回值的问题(String)

zebi 2002-11-04 05:04:10
请问从Dll中返回字符串值最保险的办法是什么呢?

我是这样做的,

function GetStrings: Pointer;stdcall;
var
strResult: String;
begin
.....
strResult := 'Hello';
.....

Result := PChar(strResult);

end;


可是不太稳定,有时返回的值后面有乱码,请问是什么原因?
...全文
158 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zebi 2002-11-06
  • 打赏
  • 举报
回复
我 UP
zebi 2002-11-06
  • 打赏
  • 举报
回复
那怎么保证在Delphi里做的Dll,(返回字符串)供其他语言调用呢?
zebi 2002-11-06
  • 打赏
  • 举报
回复
to daniel007(添) :

非常谢谢你,我理解了你所说的,可是我不知道在Dll里应该怎么做?在外部Exe里又怎么做,你能详细一点给我写个Demo吗?谢谢!

我的外部Exe程序是用Vb写的
daniel007 2002-11-06
  • 打赏
  • 举报
回复
function GetStrings: Pointer;stdcall;
var
strResult: String;
begin
.....
strResult := 'Hello';
.....

Result := PChar(strResult);

end;
这是一个对象生存期的问题,strResult是你在该函数内部声明的,该函数结束后就不能够保证该对象的有效性了(因为该对象指向的内存有可能被其他程序重新写入),这时就有可能出现乱码了,解决的办法一个使用静态声明(象C++那样),一个就是声明一个指针,然后分配空间,在调用Dll的外部程序中再去释放该内存即可
findya 2002-11-05
  • 打赏
  • 举报
回复
如果用string的话,在两边的dpr文件里都use ShareMem,写在use的第一个
zebi 2002-11-05
  • 打赏
  • 举报
回复
我已经将String转为PChar了,可是为什么还是有乱码呢?

比如说返回'123'
他有时就能返回 '123 '

不知道123的后面是什么东东,我在调用程序里调用该函数后给Text1赋值,如:

dim a as integer
dim b as string
b = ""
a = GetStrings(b)

text1.text = b & "|||"
MsgBox a

a返回的数字没有问题,可是b返回来的值就不稳定了,
我想让他返回“123”

可是在Text1里有时会显示123,正确的应该是“123|||”,不知道为什么?
jiaclassmate 2002-11-05
  • 打赏
  • 举报
回复
PChar是一个结尾为NULL的字符串。PChar(string)是把String[0]去掉,在结尾加一个NULL
zebi 2002-11-05
  • 打赏
  • 举报
回复
可是在Vb中没有PChar类型啊!

我的Dll是要在Vb中调用的!

在Vb中应该是什么类型呢?
jiaclassmate 2002-11-05
  • 打赏
  • 举报
回复
你用的是VB我不太熟悉。在Delphi里PChar的最后一位是NULL,在VB里NULL是怎么处理的我就不知道了。
ctk 2002-11-04
  • 打赏
  • 举报
回复
建议你采用netlib(河外孤星)提出的方式,不管你是传入或传出,字符串都用pchar类型,如果是静态调用用"string"将不会有问题
zebi 2002-11-04
  • 打赏
  • 举报
回复
to netlib:

我的函数也有一个这么一个参数,我没有写出来!

我的函数原型是这样的:
function GetStrings(var AChar: PChar): Integer;stdcall;
var
strResult: String;
begin
.....
strResult := 'Hello';
.....

AChar := PChar(strResult);

end;

返回的 Integer 是对的,可是我返回的AChar有时就有乱码?为什么呢?
还有就是在这儿定义 PChar和Pointer有什么区别呢?
qiandeng 2002-11-04
  • 打赏
  • 举报
回复
学习
netlib 2002-11-04
  • 打赏
  • 举报
回复
不是不稳定,你这样作本身就是错误的。

function GetStrings(var AChar : PChar): Pointer;
var
strResult: String;
begin
.....
strResult := 'Hello';
.....

AChar := PChar(strResult);

end;
ruihuahan 2002-11-04
  • 打赏
  • 举报
回复
关注

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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