CoFreeUnusedLibrariesEx 函式 (combaseapi.h)
卸除任何不再使用且卸除延遲已過期的 DLL。
語法
void CoFreeUnusedLibrariesEx(
[in] DWORD dwUnloadDelay,
[in] DWORD dwReserved
);
參數
[in] dwUnloadDelay
DLL 指出它可卸除的時間之間,延遲以毫秒為單位,直到成為要卸除的候選項目為止。 將此參數設定為 INFINITE 會使用系統預設延遲 (10 分鐘) 。 將此參數設定為 0 會強制卸除任何 DLL,而不會有任何延遲。
[in] dwReserved
此參數是保留的,而且必須是 0。
傳回值
無
備註
COM 提供函式來回收包含元件的 DLL 所持有的記憶體。 最常使用的函式是 CoFreeUnusedLibraries。 CoFreeUnusedLibraries 不會立即釋放沒有作用中物件的 DLL。 多線程 Apartment (MTA) 和中性 Apartment 有 10 分鐘的延遲, (NA) 。 對於單一線程 Apartment (STA) ,則不會延遲。
CoFreeUnusedLibraries 的 10 分鐘延遲是避免卸除元件 DLL 所造成的多線程競爭狀況。 對於許多應用程式而言,此默認延遲可能太長。
COM 會維護已針對可裝載於呼叫此函式之線程上可裝載之 Apartment 元件的作用中 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 所觸發,提供線程模型設定為 [免費]、[中性] 或 [兩者] 的線程模型。 若線程模型設定為 Apartment (或未指定任何線程模型 ) ,dwUnloadDelay 會被視為 0,因為這些元件會系結至裝載 Apartment 的單一線程。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows XP [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows Server 2003 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | combaseapi.h (包含 Objbase.h) |
程式庫 | Ole32.lib |
Dll | ComBase.dll |