DLL函数传参的问题(50分)

  • 主题发起人 对酒当歌
  • 开始时间

对酒当歌

Unregistered / Unconfirmed
GUEST, unregistred user!
在DLL中定义一个函数fun(var dest:pchar;const resource:pchar),
要求在其他语言中引用,此语言支持传引用,但不支持指针,我想问如下问题:
string a,b
fun(a,b)
则两个Pchar变量能否在dll内部销毁,还是应由调用方负责,调用方不支持指针,怎样处理?
不管他会不会有memory leak
 
建议用varient传递参数
 
对于象VB类的编译器而言,引用就是指针
在多语言协同开发的时候
首要遵循的一个最重要的原则就是:
谁分配,谁释放
例如,DELPHI中可能会直接使用pchar(somestring)来得到一个指针,最后该指针指向的
内容的释放是通过somestring的自动释放而释放的
而如果使用AllocMem,则需要FreeMem来释放
对于VB而言,假使你使用的是一个STRING的引用,最后该指针的内容的释放是由STRING
的自动释放而释放的
在这个具体的例子里,dll根本无需理会resource的释放问题,但是dest却很难处理,
第一,dest是调用者分配的,被调用者不知道如何处理
第二,执行完后dest可能会被被调用者修改,而调用者不知道该如何处理释放问题。
因此,无论如何处理,均有问题。Leak无法避免。
因此,这个FUN在多语言混合编程里,可以说是一个“错误”的程序
作者可能只是希望可以回传内容给DEST,其实这可以通过类似于操作系统的API方法来实现
例如:
UINT GetSystemDirectory(
LPTSTR lpBuffer, // address of buffer for system directory
UINT uSize // size of directory buffer
);
翻译成为DELPHI API就是:
Function GetSystemDirectory(lpBuffer:pchar;uSize:DWORD):DWORD;
lpBuffer是一个预先分配好的缓冲区,用于被调用者回填,uSize是其大小。
这样,使用VB类的来调用,可以先申明一个字符串
然后将字符串的大小设置成一个可能的最大长度
procedure fun(dest:pchar;destSize:dword;const resource:pchar);
调用:
string a,b
set a to length equ maxSize
fun(a,maxSize,b)
 
接受答案了.
 

Similar threads

顶部