coLockObjectExternal 函式 (combaseapi.h)
呼叫可鎖定物件,以確保它保留在記憶體中,或釋放這類鎖定。
語法
HRESULT CoLockObjectExternal(
[in] LPUNKNOWN pUnk,
[in] BOOL fLock,
[in] BOOL fLastUnlockReleases
);
參數
[in] pUnk
要鎖定或解除鎖定之物件上 IUnknown 介面的指標。
[in] fLock
指出物件是要鎖定還是釋放。 如果此參數為 TRUE,則物件會保留在記憶體中,與 AddRef/Release 作業、註冊或撤銷無關。 如果此參數為 FALSE,則會釋放先前以呼叫此函式所設定的鎖定。
[in] fLastUnlockReleases
如果鎖定是應該讓物件保持運作的最後一個參考,請指定 TRUE 以釋放物件的所有指標, (可能有其他參考不應該讓它保持運作) 。 否則,請指定 FALSE。
如果 fLock 為 TRUE,則會忽略此參數。
傳回值
此函式可以傳回標準傳回值E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED和S_OK。
備註
CoLockObjectExternal 函式必須在對象實際所在的進程中呼叫 (EXE 進程,而不是處理程式) 載入的進程。
CoLockObjectExternal 函式可防止對象的參考計數移至零,藉此將它「鎖定」存在,直到釋放鎖定為止。 相同的函式 (與不同的參數) 釋放鎖定。 鎖定是藉由在 物件上呼叫 IUnknown::AddRef 來實作。 接著,系統會等候在 物件上呼叫 IUnknown::Release,直到稍後呼叫將 fLock 設為 FALSE 的 CoLockObjectExternal 為止。 此函式可用來代表使用者維護物件上的參考計數,因為它在物件外部運作,就像用戶一樣。
用戶對於應用程式的存留期有明確的控制權,即使有外部鎖定也一樣。 也就是說,如果使用者決定關閉應用程式,它就必須關閉。 如果外部鎖定 (例如 CoLockObjectExternal) 所設定的鎖定,應用程式可以呼叫 CoDisconnectObject 函式,強制這些連線在關機之前關閉。
呼叫 CoLockObjectExternal 會在對象上設定強式鎖定。 強式鎖定會將物件保留在記憶體中,而弱式鎖定則不會。 例如,在 OLE 內嵌的無訊息更新期間,需要強式鎖定。 內嵌物件的容器必須保留在記憶體中,直到更新程式完成為止。 應用程式物件上也必須有強式鎖定,以確保應用程式保持運作,直到應用程式完成提供服務給客戶端為止。 所有外部參考都會在物件上放置強式參考鎖定。
CoLockObjectExternal 函式通常會在下列情況下呼叫:
- 當 fLock 和 fLastLockReleases 變成可見時,對象伺服器應該呼叫 CoLockObjectExternal 並設定為 TRUE。 此呼叫會代表使用者建立強式鎖定。 當應用程式關閉時,請釋放呼叫 CoLockObjectExternal 的鎖定,並將 fLock 設定為 FALSE , 並將 fLastLockReleases 設定為 TRUE。
- 您也可以在 IOleContainer::LockContainer 的實作中使用對 CoLockObjectExternal 的呼叫。
除非應用程式透過 呼叫 CoLockObjectExternal 完全管理其應用程式和檔關機的所有層面,否則容器必須在 LockContainer 中保留私人鎖定計數,以便在鎖定計數達到零且容器不可見時結束。 維護關機的所有層面,並避免保留私人鎖定計數,這表示每當發生下列其中一個情況時,都應該呼叫 CoLockObjectExternal :
- 檔會建立並終結或變成可見或不可見。
- 用戶啟動並關閉應用程式。
- 虛擬物件會建立並終結。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
最低支援的伺服器 | Windows 2000 Server [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | combaseapi.h (包含 Objbase.h) |
程式庫 | Ole32.lib |
Dll | Ole32.dll |