2010-05-27 48 views

回答

2

該功能用於DllCanUnloadNow()正常工作。

您知道,當您爲進程內服務器調用CoCreateInstance()時,COM會自動調用LoadLibraryEx()來根據需要加載COM服務器DLL。但是,DLL多長時間保持加載?事實上,COM爲每個加載的COM服務器DLL定期調用DllCanUnloadNow()。如果它返回S_OK COM被允許呼叫FreeLibrary()

什麼時候可以安全地卸載DLL?顯然你不能卸載它,直到由DLL實現的所有對象都被銷燬。因此,「鎖定計數」是一個全局整數變量,它計算由DLL實現的活動對象的數量。

當創建一個新的COM對象 - CComModule::Lock()從它的構造(通常CComObject構造函數)調用並遞增變量,當對象被銷燬 - CComModule::Unlock()從其析構函數調用,並且遞減變量。當CComModule::GetLockCount()返回零時,表示沒有活動對象,並且可以安全地卸載該DLL。

所以鎖定計數與IUnknown實施的參考計數非常相似。引用計數是每個對象,鎖定計數是每個COM進程內服務器。

相關問題