有关VB调用DELPHI写的DLL问题

binyao 2002-08-17 07:53:40
我用DELPHI6写了一个DLL,目前在VB中能调用并返回正确结果,但有点小问题:VB程序退出时,说XXXXX内存不能WRITE。
仔细考虑后,我怀疑是以下原因:VB调用DLL时用STRING类型的参数并BYREF传递地址,DLL中给该STRING类型的参数赋值(该参数的内存实际上是在DLL中分配的)。VB退出时,自动释放内存,但上述STRING类型参数的内存由于是DLL分配的,无法释放,造成错误。
为了验证我的推测,我又写了一个DLL,用INTEGER做参数,结果不会错误。INTEGER类型的参数的内存是在VB中声明时分配的。

现有以下问题:1、我的推测是否正确?2、如何解决STRING类型参数问题?
谢谢高手指点,感激不尽。
...全文
20 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
binyao 2002-08-18
  • 打赏
  • 举报
回复
感谢各位的帮助,我的问题已经解决。
thirdapple:您可能未能理解我的意思,我是要把VB的参数传到DLL中,由DLL改写后传回来,所以不能用BYVAL。
事实证明,我原先的推测是正确的。
为了让大家一起提高,把我的方法介绍一下:
VB声明STRING变量后,必须分配空间;DLL中,必须用STRCOPY方法将值复制到该参数,而不能直接赋值。至于我提到的array [x..n] of char,只有当起始下标是0的时候,才能与PCHAR兼容(事实上,这才是困扰我时间最长的问题)
madyak 2002-08-17
  • 打赏
  • 举报
回复
再用变参试试!
binyao 2002-08-17
  • 打赏
  • 举报
回复
多谢mardyak,不过您可能没有试过类似的程序。
根据我的经验,VB调用DELPHI,应使用STRING。说到底,STRING也是一个32位的指针,最后有NULL结尾。
其次,我的程序必须要用STRING。原因如下:
var
s :array[1..0] of char;
p:pchar;
ss:string;
....
这三种类型间的正确赋值方法如下:
p:=@s;
ss:=s;
从上述语句可知,s的地址付给了PCHAR的变量。如果退出DLL,S的内存即被释放,如果再去操作P,非发生错误不可。(实际上,上述程序我已经实验过)而ss:=s的操作,是给ss分配一块内存,将s的内容复制到ss。
由于我的程序里用了array[x..n]of char的类型,用PCHAR显然是不合适的。
madyak 2002-08-17
  • 打赏
  • 举报
回复
不要用string改用Pchar,就可以了!

5,388

社区成员

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

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