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