在Windows 下. 如果DLL 输出的例程是长字符串或者动态数组作为参数或者作为函数返回值(不管是直接的,还是通过记录或对象封装的),那么DLL 和它的客户端程序(或DLL)必须使用ShareMem 单元. 为什么在使用长字符串或者动态数组时必须使用ShareMem单元作为参数.BORLANDMM.DLL 这个DLL 作用是什么呢??

解决方案 »

  1.   

    就是让exe和dll共用同一个内存管理器,这样由delphi自动管理的变量(如string、动态数组类型),当出现由模块A分配、模块B释放(如在exe中分配了string,在dll中被自动释放)的情况时,不会由于因为在不同的内存管理器中没有记录导致无法正确释放另外不要再用borlandmm这个烂memory manager了,fastmm在各个方面都超过它,也不再需要带个dll发布了(它会尝试在一个固定地址申请内存作为内存管理器),连borland自己都从d2006开始照抄fastmm了
      

  2.   

     ShareMem 是BORLANDMM.DLL 内存管理器的接口单元,它允许在模块间共享动态分配的内存。 BORLANDMM.DLL必须连同使用ShareMem单元的程序和DLL一同发布。当程序或DLL使用ShareMem 时,它的内存管理器被BORLANDMM.DLL 中的取代。
     其实我觉得FastShareMem还好一些…………至少比Borland Share优化了不少
      

  3.   

    共用内存管理器!
    看一下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.