IPropertyStorage::Commit 方法 (propidl.h)

IPropertyStorage::Commit 方法會將對屬性儲存物件所做的變更儲存至父記憶體物件。

語法

HRESULT Commit(
  [in] DWORD grfCommitFlags
);

參數

[in] grfCommitFlags

旗標,指定要執行認可的條件。 如需特定旗標及其意義的詳細資訊,請參閱一節。

傳回值

此方法支持標準傳回值E_UNEXPECTED,以及下列各項:

備註

如同 IStorage::Commit,IPropertyStorage::Commit 方法可確保對屬性儲存物件所做的任何變更都反映在父記憶體中。

在複合檔案實作的直接模式中,呼叫此方法會導致記憶體緩衝區中目前的任何變更排清至基礎屬性數據流。 在非簡單屬性集的複合檔案實作中,也會在具有傳遞 grfCommitFlags 參數的基礎子記憶體物件上呼叫 IStorage::Commit

在交易模式中,此方法會導致變更永久反映在記憶體物件的永續性影像中。 自開啟此屬性集之後,或自這個屬性集開啟后,必須對這個屬性集進行認可的變更。 認可方法會將對一個物件層級所做的變更發佈至下一個層級。 當然,這仍受限於可能包含此屬性集之物件上的任何外部層級交易。 開啟屬性集時,必須指定寫入許可權, (透過 IPropertySetStorage) 開啟屬性集,讓認可作業成功。

如果認可作業因故失敗,屬性儲存物件的狀態會維持在認可之前的狀態。

此呼叫不會影響從這個屬性記憶體開啟的現有記憶體或數據流值屬性,但會認可它們。

下表列出 grfCommitFlags 參數的有效值。

意義
STGC_DEFAULT 根據一般交易語意認可。 最後一個寫入器會勝出。 此旗標可能無法使用其他旗標值來指定。
STGC_ONLYIFCURRENT 只有在屬性集的目前永續性內容是即將認可之變更的基礎內容時,才會認可變更。 也就是說,如果屬性集的內容已由認可從另一個屬性集的開頭變更,則不會認可變更。 如果認可因這個原因而失敗,則會傳回錯誤STG_E_NOTCURRENT。
STGC_OVERWRITE 只有在認可沒有進一步外部巢狀層級交易的交易時才有用,不過在所有情況下都可以接受。
注意 表示呼叫端願意承擔某些數據損毀的風險,但代價是目的地磁碟區上的磁碟使用量降低。 此旗標在磁碟空間不足的情況下可能很有用,不過應該謹慎使用。
 
 
注意 使用 IPropertyStorage::Commit 將屬性寫入 Windows XP 上的圖像檔無法運作。 受影響的影像檔格式包括:
  • .bmp
  • .dib
  • .emf
  • .gif
  • .ico
  • .jfif
  • .jpe
  • .jpeg
  • .jpg
  • .png
  • 。Rle
  • .tiff
  • .wmf
由於 Windows XP 上映像檔屬性處理程式中的 Bug,呼叫 IPropertyStorage::Commit 實際上會捨棄任何所做的變更,而不是保存這些變更。

因應措施是

省略 對 IPropertyStorage::Commit 的呼叫。 在 XP 映像文件屬性處理程式上呼叫 IUnknown::Release,而不呼叫 IPropertyStorage::Commit 會先隱含認可檔案的變更。 請注意,一般而言,呼叫 IUnknown::Release 而不先呼叫 IPropertyStorage::Commit 將會捨棄所做的任何變更;此因應措施專屬於 Windows XP 上的圖像檔屬性處理程式。 另請注意,在較新版本的 Windows 上,此元件會正常運作 (,也就是呼叫 IPropertyStorage::Commit 會保存變更並呼叫 IUnknown::Release 而不呼叫 IPropertyStorage::Commit 會捨棄它們) 。

 

規格需求

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

另請參閱

IPropertyStorage

IPropertyStorage::ReadMultiple

IStorage::Commit