为什么Dll返回PChar类型数据,返回的字符串会出现乱码?

zhaohui_1981 2006-11-10 03:55:50
现在我在程序中调用DLL提供的一个函数,函数原形如下
function ReadRecord(aCom,aMachineNo : Integer): PChar; StdCall ;
一开始返回的数据是正确的,过了段时间返回值就会出问题,返回的数据不完整从而出现乱码,或者返回的值是DLL中别的变量里的值,但是在日志当中看在ReadRecord函数返回前与返回后DLL中该字符串的内容都是正确的,在调用接口那段程序里就出错了。搞不清楚为什么,请大家赐教!
接收返回值的变量的类型 我用string 以及pchar 都试过了,都会有这个问题
...全文
328 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
myjerry 2006-11-10
  • 打赏
  • 举报
回复
最安全的方法就是像comanche(太可怕)的建议那样,由调用者开辟一块内存传递给被调用者。
quicksand201 2006-11-10
  • 打赏
  • 举报
回复
dll中的返回值用个全局的变量来保存应该就可以了
Allan_xd 2006-11-10
  • 打赏
  • 举报
回复
另外在不改变函数原型的情况下可以把要返回的结果存入一个全程变量中。这样做有个限制就是在调用者获得返回结果前保障这个全程变量内容没被其它代码改写。
comanche 2006-11-10
  • 打赏
  • 举报
回复
是, 如果你确定长度不会超 size, 也可以 string(buf) = 'xxxxx';
zhaohui_1981 2006-11-10
  • 打赏
  • 举报
回复
硬拷贝指的是用strcopy函数进行拷贝吗?
HsWong 2006-11-10
  • 打赏
  • 举报
回复
用Char数组也可以
ccrun.com 2006-11-10
  • 打赏
  • 举报
回复
同意comanche,不要把dll中函数内部分配的空间地址作为函数的返回值,这样很容易AV。

正确的做法就是由调用者开辟缓冲,并且将缓冲地区和长度作为参数传递给函数。
zhaohui_1981 2006-11-10
  • 打赏
  • 举报
回复
正确的值应该是 
'0005684519'
但有时收到的错误值是这样的
'00056845'#$18
'00043954H'
comanche 2006-11-10
  • 打赏
  • 举报
回复
这样作不对, string 作为返回就要引用 borlndmm.dll 就正常, 不过这样作 dll 就不标准了

要用 Pchar, 但Pchar 不能作返回, 因为你返回的只是个指针, 这个地址处的内容会改变的, 正确作法是

function ReadRecord(aCom,aMachineNo : Integer; Buf: Pchar; Size: Integer): Integer;

由调用者分配一个足够大的内存, dll 中要用硬拷贝的方法把内容放到 Buf 里, 返回值可以是写入多少字节, 也可以不要
GARNETT2183 2006-11-10
  • 打赏
  • 举报
回复
试试
PWideChar 和WideString

16,748

社区成员

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

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