我有一个 dll 导出一个返回接口的函数。
我为用于调用导出函数的 LoadLibrary、GetProcAddress 和 FreeLibrary 函数创建了一个包装器。
TInterfaceGetter = class
private
...
public
constructor Create;
destructor Destroy; override;
function GetInterface: IMyInterface;
end;
第一次调用 GetInterface 时,此包装器会延迟加载 dll 并缓存导出函数的模块句柄和 proc 地址。对 FreeLibrary 的调用发生在包装器的析构函数中。
一切都很好,除非客户端代码在释放包装器后挂在接口引用上。当接口引用最终超出范围时,对 _IntfClear 的调用会引发访问冲突,因为 dll 以及它使用的任何内存已经从客户端的内存空间中卸载。
我怎样才能优雅地处理这个?完整的 COM 实现如何处理这种情况?