在delphi DLL中使用delphi应用程序的内存管理器(无需重新编译应用程序)

And*_*rey 0 delphi dll memory-leaks memory-management

我需要编写一个DLL(使用Delphi),它动态加载到delphi应用程序中并进行RTTI查询(典型的操作是获取控件属性的字符串值).经典的问题是在应用程序和DLL之间传递字符串(和对象)是有问题的,因为两者中使用了不同的内存管理器(这可能导致内存问题,例如DLL的内存管理器会尝试释放由Application的内存管理器分配的内存).

有没有办法以不依赖于delphi版本的方式将DLL的内存管理器设置为应用程序的内存管理器?有什么想法吗?

2010年10月编辑:

由于对这个主题的兴趣几乎消失了 - 我将描述我最终得到的(非常差的)解决方案,以便其他人理解为什么我不接受任何建议的答案.

因此,一个哈克的方式来执行这样的事情是要找到RVAMemoryManager结构(参见System.pas的实现部分)和DLL硬编码.这样,DLL就能够将其私有内存管理器设置为与其加载的应用程序相同.它适用于一些限制和问题; 无论如何 - 它非常依赖于Delphi编译器和链接器选项.

虽然这不是我正在寻找的答案 - 我没想到比这更好的东西.

Fra*_*ois 7

为您的应用程序和DLL使用相同的内存管理器.

对于包含新的FastMM内存管理器的Delphi的最新版本,使用SimpleShareMem作为应用程序和DLL项目中的第一个单元.

或者从SourceForge下载完整的FastMM4,在FastMM4Options.Inc(ShareMM,ShareMMIfLibrary,AttemptToUseSharedMM)中设置Flags,并将FastMM4作为应用程序和DLL项目中的第一个单元.

  • 对不起,但你已经回答了其他问题,而不是我的;) (2认同)