dll的问题?

sailer_shi 2003-10-23 09:58:44
我的Dll返回的是String的类型,但是在调用的时候总是报Invalid pointer operation 什么原因?
...全文
27 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Spacesoft 2003-10-25
  • 打赏
  • 举报
回复
string 类型的内存是自动管理的,也就是说你写

strTmp := 'aa';

的时候,它自动的申请足够放‘aa’的内存。而你写

strTmp2 := strTmp;

的时候,string 不分配新的内存,只是给strTmp添加一条引用,表示“你现在用的缓冲区别人也在用,你用完了别急着释放”。一直到最后一个使用这片内存的string都不再使用那块缓冲区的时候,这片内存就被释放掉了。

好了,说了半天原理该解答问题了^_^

当在DLL 中传递string ,并且没有uses ShareMem 的时候,DLL 中使用的string 是可能会有对string 内部缓冲区的引用管理错误的,也就是说:一边认为这些缓冲区已经没有人用了,可以释放了,而另外一边还以为这些缓冲区依旧可以正常使用。这就是报Invalid pointer operation 弹框儿的原因所在了。

应该注意的是,内存被释放不表示它们同时被置零了,所以释放后,原来缓冲区里还有那些数据,尽管系统认为这些区域已经无效并且不保证这些区域的安全了。我想这就是还能返回正确值的原因吧。

和这个问题类似的还有Delphi 中的动态array。

解决这个问题的办法一般有三个:
1、在两边都uses ShareMem ,注意:ShareMem 必须放在uses 之后第一个。
2、不在DLL 与EXE 之间传递string,改成传递array[1..BUFF_LEN] of Char,这样虽然比较僵化,却很通用,也可以用来在Delphi 和VC之间传递数据。
3、用COM 接口


更多关于delphi 中的字符串问题,可以参考我写的文章《Delphi 中的字符串》,也许会有帮助。

http://www.csdn.net/develop/read_article.asp?id=20753
sailer_shi 2003-10-24
  • 打赏
  • 举报
回复
我现在想知道为什么还能返回正确的值
而且我用Try想把错误屏蔽掉,但还是不行
marlboroywp 2003-10-24
  • 打赏
  • 举报
回复
Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters.

看了这段说明就知道为什么了,这是delphi帮你生成DLL的时候给的一段note
hiflower 2003-10-23
  • 打赏
  • 举报
回复
PChar 以 #0 为结束
String 用 长度指示
sailer_shi 2003-10-23
  • 打赏
  • 举报
回复
不懂,还是不懂

PChar和string有什么区别呀,为什么我以前就可以返回值,而且不会报错,但是同样的代码,只是把函数名称变了,就报错了
sailer_shi 2003-10-23
  • 打赏
  • 举报
回复
还有在调用Dll的时候external和StdCall的功能是什么?总是用,但是不知道为什么要这么用!晕~~~~~~~~~~~~~~~~~
sailer_shi 2003-10-23
  • 打赏
  • 举报
回复
还有 他报了这个错后还能得到正确的返回值
hzq99 2003-10-23
  • 打赏
  • 举报
回复
最好用phar类型
sailer_shi 2003-10-23
  • 打赏
  • 举报
回复
那为什么返回的值还是对的呢?
hiflower 2003-10-23
  • 打赏
  • 举报
回复
external 指示这是一个外部函数
stdcall 是参数传递顺序的一种

用 string 作为参数和返回时,要 uses ShareMem

5,391

社区成员

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

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