インターフェイスを返す関数をエクスポートする dll があります。
エクスポートされた関数を呼び出すために使用される LoadLibrary、GetProcAddress、および FreeLibrary 関数のラッパーを作成しました。
TInterfaceGetter = class
private
...
public
constructor Create;
destructor Destroy; override;
function GetInterface: IMyInterface;
end;
このラッパーは、DLL を遅延ロードし、GetInterface が初めて呼び出されたときに、エクスポートされた関数のモジュール ハンドルと proc アドレスをキャッシュします。FreeLibrary への呼び出しは、ラッパーのデストラクタで発生します。
ラッパーを解放した後にクライアント コードがインターフェイス参照にハングアップする場合を除いて、すべてがうまく機能します。インターフェイス参照が最終的にスコープ外になると、_IntfClear への結果の呼び出しによってアクセス違反が発生します。これは、dll とそれが使用していたメモリがクライアントのメモリ空間から既にアンロードされているためです。
どうすればこれを優雅に処理できますか?本格的な COM 実装は、このシナリオをどのように処理しますか?