zoukankan      html  css  js  c++  java
  • DLL何时需共享内存管理器

    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;//!!!!
    View Code

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

  • 相关阅读:
    出现System.web.mvc冲突的原因及解决方法CS0433
    看完此文还不懂NB-IoT,你就过来掐死我吧...
    html5调用手机陀螺仪实现方向辨识
    黑盒测试和白盒测试的区别
    CentOS7 下 keepalived 的安装和配置
    centos 下 mysql+keepalived实现双主自由切换
    MySQL 高可用性—keepalived+mysql双主(有详细步骤和全部配置项解释)
    备份VMware虚拟磁盘文件 移植到其他虚拟机
    Centos7 Mysql 双机热备实现数据库高可用
    CentOS7配置Mysql热备份
  • 原文地址:https://www.cnblogs.com/key-ok/p/3358948.html
Copyright © 2011-2022 走看看