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 所持有的内存。 最常用的函数是 CoFreeUnusedLibrariesCoFreeUnusedLibraries 不会立即释放没有活动对象的 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

另请参阅

CoFreeAllLibraries

CoFreeLibrary

CoFreeUnusedLibraries

CoLoadLibrary

DllCanUnloadNow