共用方式為


(comsvcs.h) ICrmLogControl::RegisterCompensator 方法

CRM 背景工作角色會使用此方法向CRM基礎結構註冊CRM補償器。 它必須是CRM背景工作角色呼叫的第一個方法,而且只能成功呼叫一次。 如果CRM背景工作角色在呼叫此方法時收到「復原進行中」錯誤碼,它應該再次呼叫此方法,直到收到成功為止。

語法

HRESULT RegisterCompensator(
  [in] LPCWSTR lpcwstrProgIdCompensator,
  [in] LPCWSTR lpcwstrDescription,
  [in] LONG    lCrmRegFlags
);

參數

[in] lpcwstrProgIdCompensator

CRM 補償器的 ProgId。 也會接受字串格式之CRM補償器的CLSID。

[in] lpcwstrDescription

監視介面要使用的描述字串。

[in] lCrmRegFlags

CRM COMpensator 應該接收哪些交易完成階段的 CRMREGFLAGS 列舉旗標,以及如果嘗試復原之後,不確定的交易是否仍會失敗。

傳回值

這個方法可以傳回下列值。

傳回碼 描述
S_OK
已成功完成命令。
E_POINTER
NULL 指標是以自變數的形式提供。
E_UNEXPECTED
已發生未預期的錯誤。
XACT_E_NOTRANSACTION
建立CRM Clerk的元件沒有交易。
XACT_E_RECOVERYINPROGRESS
CRM 記錄檔的復原仍在進行中。
XACT_E_RECOVERY_FAILED
復原CRM記錄檔失敗,因為不確定的交易仍會保留。
XACT_E_WRONGSTATE
這個方法在錯誤狀態中呼叫;在 RegisterCompensator 之前,或在交易完成 (CRM 背景工作角色) 時。
E_OUTOFMEMORY
發生記憶體不足錯誤。
E_NOINTERFACE
CRM Compensator 不支援至少一個必要的介面, (ICrmCompensator 或 ICrmCompensatorVariants) 。

備註

lCrmRegFlags 參數可讓實作者決定 CRM Compensator 想要接收的交易完成階段。 某些CRM補償器可能會在準備階段執行任何工作,因此不需要接收準備通知;它可以改善效能,以指定在此情況下不需要任何準備階段。

建議將CRM背景工作角色和CRM補償器開發為「兩者」線程元件, (線程模型 = 任何Apartment) 。 不過,在某些情況下,這可能是因為語言條件約束 (,例如,使用 Visual Basic) 開發 CMS 時。 Apartment 線程 CRM Compensators (線程模型 = 單一線程 Apartment) 會在準備階段中死結,除非其同步處理屬性設定為「不支援」。 Apartment 線程 CRM 補償器的另一個替代方案是,如果不需要,則會略過準備階段。

在多個分散式交易協調器 (DDC) 的情況下,DTC 交易可能會進入不確定狀態。 一般而言,這是因為在交易期間發生中斷,而且無法連絡交易的產生者來找出交易的結果。 在此情況下,CRM 基礎結構無法判斷交易的結果。 CRM 實作者可以決定是否應該在此案例中允許新的交易。

RegisterCompensator 上指定「不確定時仍失敗」旗標,如果在復原後仍維持不確定的交易, 則 RegisterCompensator 的呼叫會失敗,並出現「復原失敗」錯誤碼。 如果未指定「如果不確定仍失敗」旗標,復原會成功、允許新的交易,且不確定的交易會保留在 CRM 記錄檔中。 當應用程式伺服器進程重新啟動) 時,CRM 基礎結構會在下一個復原 (再次嘗試解決這些不確定的交易。

規格需求

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

另請參閱

ICrmLogControl