IPropertyStorage::Commit 方法 (propidl.h)

IPropertyStorage::Commit 方法将对属性存储对象所做的更改保存到父存储对象。

语法

HRESULT Commit(
  [in] DWORD grfCommitFlags
);

参数

[in] grfCommitFlags

指定执行提交的条件的标志。 有关特定标志及其含义的详细信息,请参阅备注部分。

返回值

此方法支持标准返回值E_UNEXPECTED以及以下值:

注解

IStorage::Commit 一样, IPropertyStorage::Commit 方法可确保对属性存储对象所做的任何更改都反映在父存储中。

在复合文件实现的直接模式下,对此方法的调用会导致内存缓冲区中当前的任何更改刷新到基础属性流。 在非简单属性集的复合文件实现中,还会在具有传递的 grfCommitFlags 参数的基础子存储对象上调用 IStorage::Commit

在事务处理模式下,此方法会导致更改永久反映在存储对象的持久图像中。 提交的更改必须已对此属性集进行,因为该属性集已打开,或者自上次提交到该属性集的此打开之后。 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 的调用。 在不调用 IPropertyStorage ::Commit 的情况下调用 XP 映像文件属性处理程序上的 IUnknown::Release 首先隐式提交对文件的更改。 请注意,通常,在不首先调用 IPropertyStorage ::Commit 的情况下调用 IUnknown::Release 将放弃所做的任何更改;此解决方法特定于 Windows XP 上的图像文件属性处理程序。 另请注意,在更高版本的 Windows 上,此组件正常运行 (即,调用 IPropertyStorage::Commit 将保留更改,在不调用 IPropertyStorage::Commit 的情况下调用 IUnknown::Release 会将其丢弃) 。

 

要求

要求
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 propidl.h (包括 Objbase.h、Propidlbase.h)
Library Uuid.lib
DLL Ole32.dll

另请参阅

IPropertyStorage

IPropertyStorage::ReadMultiple

IStorage::Commit