共用方式為


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

如果 fLockTRUE,則會忽略此參數。

傳回值

此函式可以傳回標準傳回值E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED和S_OK。

備註

CoLockObjectExternal 函式必須在對象實際所在的進程中呼叫 (EXE 進程,而不是處理程式) 載入的進程。

CoLockObjectExternal 函式可防止對象的參考計數移至零,藉此將它「鎖定」存在,直到釋放鎖定為止。 相同的函式 (與不同的參數) 釋放鎖定。 鎖定是藉由在 物件上呼叫 IUnknown::AddRef 來實作。 接著,系統會等候在 物件上呼叫 IUnknown::Release,直到稍後呼叫將 fLock 設為 FALSECoLockObjectExternal 為止。 此函式可用來代表使用者維護物件上的參考計數,因為它在物件外部運作,就像用戶一樣。

用戶對於應用程式的存留期有明確的控制權,即使有外部鎖定也一樣。 也就是說,如果使用者決定關閉應用程式,它就必須關閉。 如果外部鎖定 (例如 CoLockObjectExternal) 所設定的鎖定,應用程式可以呼叫 CoDisconnectObject 函式,強制這些連線在關機之前關閉。

呼叫 CoLockObjectExternal 會在對象上設定強式鎖定。 強式鎖定會將物件保留在記憶體中,而弱式鎖定則不會。 例如,在 OLE 內嵌的無訊息更新期間,需要強式鎖定。 內嵌物件的容器必須保留在記憶體中,直到更新程式完成為止。 應用程式物件上也必須有強式鎖定,以確保應用程式保持運作,直到應用程式完成提供服務給客戶端為止。 所有外部參考都會在物件上放置強式參考鎖定。

CoLockObjectExternal 函式通常會在下列情況下呼叫:

  • 當 fLock 和 fLastLockReleases 變成可見時,對象伺服器應該呼叫 CoLockObjectExternal 並設定為 TRUE 此呼叫會代表使用者建立強式鎖定。 當應用程式關閉時,請釋放呼叫 CoLockObjectExternal 的鎖定,並將 fLock 設定為 FALSE並將 fLastLockReleases 設定為 TRUE
  • 您也可以在 IOleContainer::LockContainer 的實作中使用對 CoLockObjectExternal 的呼叫。
當您在LockContainer的實作中使用CoLockObjectExternal時,需要注意幾件事。 內嵌物件會在其容器上呼叫 LockContainer ,使其保持執行 (,使其) 因為沒有其他原因而保持執行。 當內嵌物件變成可見時,容器必須使用 對 OleSetContainedObject 函式的呼叫來降低其與內嵌物件的連線,讓其他連接可能會影響物件。

除非應用程式透過 呼叫 CoLockObjectExternal 完全管理其應用程式和檔關機的所有層面,否則容器必須在 LockContainer 中保留私人鎖定計數,以便在鎖定計數達到零且容器不可見時結束。 維護關機的所有層面,並避免保留私人鎖定計數,這表示每當發生下列其中一個情況時,都應該呼叫 CoLockObjectExternal

  • 檔會建立並終結或變成可見或不可見。
  • 用戶啟動並關閉應用程式。
  • 虛擬物件會建立並終結。
基於偵錯目的,保留 (的外部鎖定計數,以及在應用程式上設定的解除鎖定) 可能很有用。

規格需求

需求
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
目標平台 Windows
標頭 combaseapi.h (包含 Objbase.h)
程式庫 Ole32.lib
Dll Ole32.dll

另請參閱

IOleContainer::LockContainer

OleSetContainedObject