Delphi创建DLL时,IDE自动生成的文档中写得很清楚,当在DLL中以动态数组或String做为参数或返回值时(即RTL自动维护的数据类型),请在每个工程文件的第一个单元加上ShareMem。这样就可以使宿主程序与DLL共享内存管理器了!

这样的话,在发布程序时需要把borlndmm.DLL一同发布!

问题1:

为何要加到工程文件的第一个单元?

对于DLL和主程序这样的程序结构来说,使用2个内存管理器,在返回的数据类型为string的话,仅仅在主程序中将内存管理器中将引用数加1,而DLL的引用数不变,这样当退出DLL过程中,由于引用数为0,要对返回值进行释放,由于主程序中的数据为一个地址,将DLL地址释放,主程序中必然发生AV错误!

至于为什么ShareMem必须放第一个单元,那是因为Delphi的单元文件的initialization 
的执行顺序,与dpr中引用这个单元的顺序有关;dpr中某单元引用越靠前,则某单元的initialization就越先执行!而我们程序的 内存管理器的"替换"过程就是在initialization块里实现的 看看Delphi的ShareMem里的一点代码就了解了!

问题2:

为何要把borlndmm.dll一同发布?

请参见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');//动态调用borlndmm中的GetMem函数来使主调与dll内存管理器共享
SharedMemoryManager.FreeMem := GetProcAddress(MM,'@Borlndmm@SysFreeMem$qqrpv');
SharedMemoryManager.ReallocMem := GetProcAddress(MM, '@Borlndmm@SysReallocMem$qqrpvi');
{$ENDIF}
SetMemoryManager(SharedMemoryManager);
end; initialization
if not IsMemoryManagerSet then
InitMemoryManager;//!!!!

最后建议大家使用FastMM,                                                          borlndmm.dll已经成为一般过去式了~

最新文章

  1. JavaScriptSerializer 序列化json 时间格式
  2. CSipSimple通话记录分组
  3. InnoDB源码分析--事务日志(二)
  4. MSBuild .Targets 文件
  5. using System.Diagnostics; 日志操作
  6. xxx cannot be resolved to a type 错误解决方法
  7. linux库文件编写入门(笔记)
  8. toString&&equals方法
  9. apache 创建虚拟目录
  10. Linux上ld和ld.so命令的区别
  11. PHP 魔术方法之__set__get__unset,__isset,__call
  12. SilkTest Q&A 7
  13. strncpy和strcpy
  14. ios UITapGestureRecognizer 单指单击、单指多击、多指单击、多指多击事件操作
  15. Android 音视频开发学习思路
  16. net core体系-1概要
  17. linux 时间和时区设置
  18. Sitecore CMS中配置模板部分
  19. IDC:网管网
  20. ubuntu下为单个网卡配置多个ip

热门文章

  1. Httpclient的学习(一)
  2. 河南省第四届ACM省赛(T3) 表达式求值
  3. git 提交去除每次输账号密码
  4. Java中的break和continue以及标签
  5. LBS推荐系统的设计方法
  6. pandas-cheat-sheet
  7. 添加aimate动画
  8. Javascript 标准参考教程
  9. Prime Test(POJ 1811)
  10. RPC 原理