请教 - 关于DLL中ShareMem的使用(200分)

T

Town

Unregistered / Unconfirmed
GUEST, unregistred user!
在建立Dll时,会有这段提示: “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.”。

在《开发人员指南中》,有一个显示模式窗体的经典例子,Exports了这样的函数:
Function ShowCalendar(AHandle:THandle; ACaption:String):TDateTime:Stdcall;

为什么这时候就不需要加ShareMem单元了?

如果,在另外一个Dll中,调用这个Dll中的ShowCalendar, 需要加ShareMem么?

初学Dll, 请指教~~
 
在DLL中分配的内存归该DLL所有,当Windows卸载该DLL时所有由这个DLL分配的内存
都被释放,即使EXE或其他DLL保留一个指向该内存的指针也如此。如果用到String,
动态数组,Variant时,这将是一个主要的问题,因为你永远不知道Delphi什么时候
会自动分配内存。一般来说,如果参数中含有动态数组、String、Variant,并且要
传递参数的隶属关系,那么就用到ShareMem。
 
如果你的dll中传递数据时没有用到string类型时,就不要用sharemem
如果用到就要引用sharemem,而且还要放在第一个,程序发布时还要跟一个
b*.dll,很麻烦,最好不要用。
程序中最好用pchar来代替string
 
兄弟们, 这个函数里有 ACaption:String啊, 可是却不需要ShareMem, 恰恰是,
如果用了ShareMem,提示一堆的错误!
 
这里面没有传递aCaption的隶属关系,他是由调用者分配的,并且由调用者管理
DLL中只不过使用了他的值,并没有其它操作改变他。
 
Hi Tseug, 我看不懂这句话耶~~ Sorry, 可否举个有改变的例子啊?
 
是不是说, 如果这个String的值发生改变就必须用ShareMem了?

比如, Dll原来是Application.Caption:=ACaption; 是不是,换成
ACaption:=Application.Caption 就不行了?
 
是的, 还有一种是隐含的,他不改变内容,但是也不可以,就是通过指针引用的
 
保险起见, 还是都用PChar吧。
 
DLL内部使用String不需要引用该单元
只有在引出函数使用了String作参数的时候则必须要加该单元
 
顶部