CoFreeUnusedLibrariesEx 函数 (combaseapi.h)
卸载不再使用且卸载延迟已过期的任何 DLL。
语法
void CoFreeUnusedLibrariesEx(
[in] DWORD dwUnloadDelay,
[in] DWORD dwReserved
);
参数
[in] dwUnloadDelay
DLL 声明可以卸载该 DLL 之间的延迟(以毫秒为单位),直到它成为要卸载的候选项。 将此参数设置为 INFINITE 使用系统默认延迟 (10 分钟) 。 将此参数设置为 0 会强制卸载任何 DLL,而不会有任何延迟。
[in] dwReserved
此参数是保留的,必须为 0。
返回值
无
备注
COM 提供函数来回收包含组件的 DLL 所持有的内存。 最常用的函数是 CoFreeUnusedLibraries。 CoFreeUnusedLibraries 不会立即释放没有活动对象的 DLL。 多线程公寓 (MDA) 和中性公寓 (NAs) 延迟 10 分钟。 对于 (STA) 的单线程单元,没有延迟。
CoFreeUnusedLibraries 的 10 分钟延迟是为了避免卸载组件 DLL 导致的多线程争用情况。 对于许多应用程序,此默认延迟可能太长。
COM 维护活动 DLL 的列表,这些 DLL 已为可托管在调用此函数的线程上的单元加载组件。 调用 CoFreeUnusedLibrariesEx 时,该列表中的每个 DLL 都有其 DllCanUnloadNow 函数调用。 如果 DllCanUnloadNow 返回S_FALSE (或未) 导出,则此 DLL 尚未准备好卸载。 如果 DllCanUnloadNow 返回S_OK,则此 DLL 将从活动列表移到“候选卸载”列表。
将 DLL 添加到候选卸载列表的时间戳将 DLL dwUnloadDelay 从此移动发生时开始毫秒。 再次调用 CoFreeUnusedLibrariesEx (或 CoFreeUnusedLibraries) 时,至少从将 DLL 移动到候选卸载列表的调用中的 dwUnloadDelay 毫秒,实际上会从内存中释放 DLL。 如果 COM 在 DLL 位于候选卸载列表中时使用组件 DLL,则会将其移回活动列表。
将 dwUnloadDelay 设置为 0 可能会产生意外的后果。 组件 DLL 在从 DllCanUnloadNow 函数返回后,可能需要一些时间进行清理。 例如,如果 DLL 有自己的工作线程,则使用值 0 可能会导致问题,因为在这些线程上执行的代码将取消映射,原因是在工作线程有机会退出之前卸载 DLL。 此外,为 dwUnloadDelay 使用过短的值可能会导致性能问题,因为重新加载 DLL 的开销比让 DLL 页出更多。
此行为由为组件提供线程模型设置为“免费”、“中性”或“两者”的 DLL 触发。 对于设置为“单元 (”的线程模型,或者如果没有) 指定线程模型, dwUnloadDelay 将被视为 0,因为这些组件与托管单元的单线程相关联。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | combaseapi.h (包括 Objbase.h) |
Library | Ole32.lib |
DLL | ComBase.dll |