0

Delphi で記述された単純な DLL があります。リソースとして埋め込まれた読み取り専用データを操作する関数を提供します。各呼び出しでそのリソースをロードするのは非常に遅いことがわかったので、呼び出し間で固執するオブジェクトに入れたいと思います。

これを行う正しい方法は何ですか?以下の作品:

var
  MyObject: TMyObject;

function ReportSomethingAboutMyObject(): Integer; stdcall; export;

exports ReportSomethingAboutMyObject();

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

しかし、メモリリークやその他の予期しない動作が心配です。

オブジェクトが読み書き可能であり、非スレッドセーフである可能性がある場合、答えがどのように異なるかを知りたいと思います。

更新 1

リクエストに応じて、より具体的なユースケースを提供します。リソースとして DLL に埋め込まれたテキスト ファイル (ini) があり、ルックアップのみを行う必要があります。リソースを一度だけロードして、より単純な例として保持すると、すべてがはるかに高速に機能しTMemIniFileますTStringList。ロード後、コンテンツは変更されません。将来的には、データ構造をよりスマートなものに変更できるようにしたいと考えていますTDictionary

対照的に、グローバル オブジェクトがまったく異なるものである 2 番目のケースを検討したいと思います。たとえば、データベース接続など、呼び出し間で保持したい (非常に多くの場合があるため)。では、どのように別の方法で行う必要がありますか?

4

1 に答える 1

1

そのようなことを行い、メモリがリークしないようにしたい場合は、キャッシュ オブジェクトをユニットに移動してみてください。ロードするinitializationコードを に、クリーンアップするコードをに入れfinalizationます。これらは、DLL のロード時およびアンロード時にそれぞれ自動的に呼び出される必要があります。

于 2013-04-01T22:35:56.073 に答える