IStorage::Commit 方法 (objidl.h)

Commit 方法可確保對在交易模式中開啟的記憶體物件所做的任何變更,都反映在父記憶體中。 對於直接模式中的非根記憶體對象,這個方法沒有任何作用。 針對根記憶體,它會反映實際裝置中的變更;例如,磁碟上的檔案。 針對以直接模式開啟的根記憶體物件,請一律在 Release 之前呼叫 IStorage::Commit 方法。 IStorage::Commit 會將直接模式根記憶體的所有記憶體緩衝區排清到磁碟,並在失敗時傳回錯誤碼。 雖然 Release 也會將記憶體緩衝區排清到磁碟,但無法在失敗時傳回任何錯誤碼。 因此,呼叫 Release 而不先呼叫 Commit 會導致不確定的結果。

語法

HRESULT Commit(
  [in] DWORD grfCommitFlags
);

參數

[in] grfCommitFlags

控制變更如何認可至記憶體物件。 如需這些值的定義,請參閱 STGC 列舉。

傳回值

這個方法可以傳回其中一個值。

傳回碼 描述
S_OK 記憶體物件的變更已成功認可至父層級。 如果已指定STGC_CONSOLIDATE,則記憶體已成功合併,或記憶體已太精簡,無法進一步合併。
STG_S_MULTIPLEOPENS 認可作業成功,但無法合併記憶體,因為記憶體已使用 STGM_NOSNAPSHOT 旗標多次開啟。
STG_S_CANNOTCONSOLIDATE 認可作業成功,但記憶體因為儲存模式不正確而無法合併。 針對複合檔案,記憶體可能已使用 STGM_NOSCRATCH 旗標開啟,或者記憶體可能不是最外層交易層級。
STG_S_CONSOLIDATIONFAILED 認可作業成功,但因為內部錯誤 (而無法合併記憶體,例如記憶體配置失敗) 。
E_PENDING 僅限異步記憶體:目前無法使用要認可的部分或所有數據。
STG_E_INVALIDFLAG grfCommitFlags 參數的值無效。
STG_E_INVALIDPARAMETER 其中一個參數無效。
STG_E_NOTCURRENT 另一個開啟的記憶體對象實例已認可變更。 因此,目前的認可作業可能會覆寫先前的變更。
STG_E_MEDIUMFULL 裝置上沒有要認可的空間。
STG_E_TOOMANYOPENFILES 無法完成認可作業,因為有太多開啟的檔案。
STG_E_REVERTED 記憶體物件已由交易樹狀結構中上方的還原作業失效。

備註

IStorage::Commit 會對處於交易模式的儲存物件進行永久變更,其中的變更會在緩衝區中累積,而且在呼叫此方法之前不會反映在記憶體物件中。 替代方式是在直接模式中開啟物件,其中變更會立即反映在記憶體物件中。 在直接模式中開啟的物件不需要呼叫 IStorage::Commit ,才能在記憶體物件中進行永久變更。 在直接模式中開啟的非根記憶體上呼叫 IStorage::Commit 方法沒有任何作用。 以直接模式開啟根記憶體物件可確保記憶體緩衝區中的變更會寫入基礎儲存裝置。

認可作業會將此記憶體物件中的目前變更及其子系發佈至記憶體階層中的下一個層級。 若要在認可變更之前復原目前的變更,請呼叫 IStorage::Revert 以回復至最後一個認可的版本。

呼叫 IStorage::Commit 不會影響此記憶體物件的目前開啟巢狀專案。 它們仍然有效,而且可以使用。 不過, IStorage::Commit 方法不會自動認可這些巢狀元素的變更。 認可作業只會將已知變更發佈至記憶體階層中的下一個較高層級。 因此,巢狀層級的交易必須先認可到此儲存物件,才能認可至較高層級。

在認可作業中,您必須採取步驟,以確保數據在認可過程中受到保護:

  • 認可根記憶體對象的變更時,呼叫端必須檢查傳回值,以判斷作業是否已順利完成,如果不是, 則 IStorage 的舊認可內容仍然保持不變且可還原。
  • 如果已開啟此記憶體物件並排除其中一些專案,則呼叫端會負責在呼叫認可之前重寫這些物件。 開啟記憶體時需要寫入模式,認可才能成功。
  • 除非在相同的記憶體物件上禁止多個同時寫入器,否則呼叫此方法的應用程式應該至少在 grfCommitFlags 參數中指定STGC_ONLYIFCURRENT,以防止某個寫入器不小心覆寫另一個寫入器所做的變更。
如果記憶體實作不支援STGC_CONSOLIDATE旗標,請在 grfCommitFlags 參數中指定的STGC_CONSOLIDATE呼叫 IStorage::Commit 會傳回值STG_E_INVALIDFLAG。

規格需求

需求
最低支援的用戶端 Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows 2000 Server [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 objidl.h
程式庫 Uuid.lib
Dll Ole32.dll

另請參閱

IStorage - 複合檔案實作

IStorage::Revert

STGC