在Windows 下. 如果DLL 输出的例程是长字符串或者动态数组作为参数或者作为函数返回值(不管是直接的,还是通过记录或对象封装的),那么DLL 和它的客户端程序(或DLL)必须使用ShareMem 单元. 为什么在使用长字符串或者动态数组时必须使用ShareMem单元作为参数.BORLANDMM.DLL 这个DLL 作用是什么呢??
解决方案 »
- xml取值问题
- 一个关于在DELPHI下向TXT文件中写数据的问题~~
- 请教一下,换肤功能是怎么实现的?是什么原理?
- 在Java 和 .net 的夹击下 Delphi 的前途?(欢迎讨论)
- 如何遍历菜单,取出菜单名--在线等待
- 如何(可以)让国外的用户给自己汇款吗?
- 来了就有分。关于DBEDIT的问题?
- 怎样把一个Word格式文件转化为Txt文本文件
- 在win2000Server下,如何设置成Internet代理?
- Delphi怎样实现多个视频同时播放的问题
- SocketConnection连接,服务端能不能主动给客户端发送信息
- 当dll中的函数返回类型为Tstrings 时,程序调用内存出错,如何解决?
其实我觉得FastShareMem还好一些…………至少比Borland Share优化了不少
看一下ShareMem.pas的初始化实现就大概明白了procedure InitMemoryManager;
var
SharedMemoryManager: TMemoryManager;
MM: Integer;
begin
// force a static reference to borlndmm.dll, so we don't have to LoadLibrary
SharedMemoryManager.GetMem := SysGetMem; MM := GetModuleHandle(DelphiMM);
{$IFDEF GLOBALALLOC}
SharedMemoryManager.GetMem := xSysGetMem;
SharedMemoryManager.FreeMem := xSysFreeMem;
SharedMemoryManager.ReallocMem := xSysReallocMem;
{$ELSE}
SharedMemoryManager.GetMem := GetProcAddress(MM,'@Borlndmm@SysGetMem$qqri');
SharedMemoryManager.FreeMem := GetProcAddress(MM,'@Borlndmm@SysFreeMem$qqrpv');
SharedMemoryManager.ReallocMem := GetProcAddress(MM, '@Borlndmm@SysReallocMem$qqrpvi');
{$ENDIF}
SetMemoryManager(SharedMemoryManager);
end;initialization
if not IsMemoryManagerSet then
InitMemoryManager;
end.