如何在Delphi DLL中保留全局对象?

时间:2013-04-01 22:31:10

标签: delphi memory-management delphi-2010

我有一个用Delphi编写的简单DLL。它提供了对某些只读数据进行操作的函数,这些函数作为资源嵌入。我发现每次调用时加载该资源的速度都很慢,所以我想将它放在一个在调用之间的对象中。

这样做的正确方法是什么?以下作品:

var
  MyObject: TMyObject;

function ReportSomethingAboutMyObject(): Integer; stdcall; export;

exports ReportSomethingAboutMyObject();

begin
  MyObject = TMyObject.Create;
  LoadTheResourceIntoObject(MyObject);
end.

但我担心内存泄漏或其他意外行为。

如果对象是可读写的并且可能是非线程安全的,我很想知道答案会有什么不同。

更新1

根据要求,我将提供更具体的用例。我有一个嵌入在DLL中的文本文件(ini)作为资源,我只需要进行查找。如果我只加载一次资源并将其保存为TMemIniFileTStringList以获得更简单的示例,那么这一切都会更快。加载后,内容不会改变。在将来,我希望能够更改更智能的数据结构,例如: TDictionary

相比之下,我想考虑第二种情况,其中全局对象是完全不同的东西,比如我想在调用之间保持的数据库连接(因为可能有很多)。那应该怎么做呢?

1 个答案:

答案 0 :(得分:1)

如果您想要执行类似操作并确保内存不会泄漏,请尝试将缓存对象移动到一个单元中。将代码加载到initialization和代码中以在finalization中清除它。这些应该在分别加载和卸载DLL时自动调用。