共用方式為


IRunningObjectTable::Register 方法 (objidl.h)

在執行中對象數據表中註冊物件及其識別Moniker, (ROT) 。

語法

HRESULT Register(
  [in]  DWORD    grfFlags,
  [in]  IUnknown *punkObject,
  [in]  IMoniker *pmkObjectName,
  [out] DWORD    *pdwRegister
);

參數

[in] grfFlags

指定 ROT 對 punkObject 的參考是弱式還是強式的,並且透過其在 ROT 中的專案控制對物件的存取。 如需詳細資訊,請參閱<備註>小節。

意義
ROTFLAGS_REGISTRATIONKEEPSALIVE
設定時,表示對象的強式註冊。
ROTFLAGS_ALLOWANYCLIENT
設定時,任何用戶端都可以透過其 ROT 中的專案連接到執行中的物件。 如果未設定,只有註冊對象的視窗站台中的用戶端可以連線到它。

[in] punkObject

正在登錄為執行中之物件的指標。

[in] pmkObjectName

識別 punkObject 之 Moniker 的指標。

[out] pdwRegister

此 ROT 專案的識別碼,可用於後續呼叫 IRunningObjectTable::RevokeIRunningObjectTable::NoteChangeTime。 呼叫端無法指定此參數的 NULL 。 如果發生錯誤,*pdwRegister 會設定為零。

傳回值

這個方法可以傳回標準傳回值E_INVALIDARG和E_OUTOFMEMORY,以及下列值。

傳回碼 描述
S_OK
已成功完成命令。
MK_S_MONIKERALREADYREGISTERED
Moniker/object pair 已成功註冊,但另一個物件 (可能相同的物件) 已經向相同的Moniker註冊。

備註

這個方法會在識別物件的Moniker下註冊物件的指標。 使用 IRunningObjectTable::GetObject 搜尋數據表時,Moniker 會當做索引鍵使用。

註冊物件時,ROT 一律會在 物件上呼叫 AddRef 。 對於未設定) 的弱式註冊 (ROTFLAGS_REGISTRATIONKEEPSALIVE,每當釋放對象的最後一個強式參考時,ROT 就會釋放物件。 對於設定) 的強註冊 (ROTFLAGS_REGISTRATIONKEEPSALIVE,ROT 會防止對象被終結,直到明確撤銷對象的註冊為止。

註冊為 LocalService 或 RunAs 的伺服器可以在呼叫 Register 中設定ROTFLAGS_ALLOWANYCLIENT旗標,以允許任何用戶端與其連線。 此位的伺服器設定必須在登錄的AppID區段中具有其可執行檔名稱,該區段參考可執行檔的AppID。 「啟動為啟動者」伺服器 (未註冊為 LocalService 或 RunAs) 不得在其呼叫中設定此旗標註冊。 如需安裝服務的詳細資訊,請參閱 安裝即服務應用程式

使用相同的Moniker註冊第二個物件,或使用相同的Moniker重新註冊相同的物件,會在 ROT 中建立第二個專案。 在此情況下, Register 會傳回MK_S_MONIKERALREADYREGISTERED。 對 Register 的每個呼叫都必須與 IRunningObjectTable::Revoke 的呼叫相符,因為即使是重複的專案都有不同的 pdwRegister 識別符。 重複註冊的問題在於,如果後續呼叫 IRunningObjectTable::IsRunning 中指定 Moniker,就無法判斷將傳回哪一個物件。

來電者附註

如果您是moniker提供者, (亦即,您會將識別物件的Moniker交給其他人存取,以便其他人存取它們) ,您必須呼叫 Register 方法,以便在對象開始執行時註冊物件。 如果您在載入物件時重新命名物件,您也必須呼叫此方法。

最常見的Moniker提供者類型是複合文件連結來源。 這包括支援連結至其檔案的伺服器應用程式, (或檔) 部分,以及支持連結至其檔案內嵌的容器應用程式。 不支援連結的伺服器應用程式也可以使用 ROT 與支援連結至內嵌的容器應用程式合作。

如果您要撰寫伺服器應用程式,則應該在開始執行時向 ROT 註冊物件,通常是在 IOleObject::D oVerb 的實作中。 對象必須在其完整Moniker下註冊,這需要使用 IOleClientSite::GetMoniker 取得其容器檔的Moniker。 您也應該撤銷並重新註冊 IOleObject::SetMoniker 實作中的 物件,如果重新命名容器檔,就會呼叫此物件。

如果您要撰寫支援連結至內嵌的容器應用程式,則應該在載入檔時向 ROT 註冊檔。 如果您的檔已重新命名,您應該撤銷並重新向 ROT 註冊它,並針對檔中的任何內嵌物件呼叫 IOleObject::SetMoniker ,讓他們有機會重新註冊自己。

當物件不再執行或其Moniker變更時,必須明確撤銷在 ROT 中註冊的物件。 此撤銷很重要,因為系統無法自動從 ROT 移除專案。 您必須快取透過 pdwRegister 寫入的標識碼,並在 IRunningObjectTable::Revoke 的呼叫中使用它來撤銷註冊。 針對強式註冊,在撤銷對象註冊時會釋放強式參考。

自 Windows Server 2003 起,如果因非預期伺服器問題而保留在 ROT 中的過時專案,COM 會自動從 ROT 移除這些過時專案。

註冊系統的 Register 實作會在 pmkObjectName 參數上呼叫 IMoniker::Reduce,以確保在註冊之前完全減少 Moniker。 如果一個物件是由多個完全縮減的Moniker所知道,則應該在所有這類Moniker下註冊。

規格需求

需求
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
目標平台 Windows
標頭 objidl.h

另請參閱

IRunningObjectTable