IStorage-Compound 文件实现

使用 IStorage 的复合文件实现,可以在驻留在复合文件对象的存储对象中创建和管理子存储和流。 若要创建复合文件对象并获取 IStorage 指针,请调用 API 函数 StgCreateStorageEx。 若要打开现有复合文件对象并获取其根 IStorage 指针,请调用 StgOpenStorageEx

使用复合存储的应用程序应在 HKEY_CLASSES_ROOT\SystemFileAssociations 中注册,并应提供自己的属性处理程序。 有关详细信息,请参阅 应用程序注册的“注册谓词和其他文件关联信息”部分。

何时使用

大多数应用程序使用此实现来创建和管理存储和流。

方法

IStorage::CreateStream

创建并打开具有此存储对象中包含的指定名称的流对象。 名称长度不得超过 31 个字符, (不包括字符串终止符) 。 保留 000 到 01f 字符,用作流/存储名称的第一个字符,供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。 IStorage::CreateStream 方法的 COM 提供的复合文件实现不支持以下行为:

  • 不支持STGM_DELETEONRELEASE标志。
  • 流对象不支持事务处理模式 (STGM_TRANSACTED) 。
  • 不支持从同一存储多次打开同一流。 必须在 grfMode 参数中指定STGM_SHARE_EXCLUSIVE共享模式标志。

IStorage::OpenStream

使用 grfMode 参数中指定的访问模式打开此存储对象中的现有流对象。 保留 000 到 01f 字符,用作流/存储名称的第一个字符,供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。 COM 提供的 IStorage::OpenStream 方法的复合文件实现不支持以下行为:

  • STGM_DELETEONRELEASE标志。
  • 流对象的事务处理模式 (STGM_TRANSACTED) 。
  • 从同一存储多次打开同一流。 必须指定STGM_SHARE_EXCLUSIVE标志。

IStorage::CreateStorage

在指定的访问模式下创建并打开具有指定名称的新存储对象。 名称长度不得超过 31 个字符, (不包括字符串终止符) 。 保留 000 到 01f 字符,用作流/存储名称的第一个字符,供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。 COM 提供的 IStorage::CreateStorage 方法的复合文件实现不支持以下行为:

  • 非根存储的STGM_PRIORITY标志。
  • 从同一父存储多次打开同一存储对象。 必须指定STGM_SHARE_EXCLUSIVE标志。
  • STGM_DELETEONRELEASE标志。 如果指定了此标志,则函数将返回STG_E_INVALIDFLAG。

IStorage::OpenStorage

在指定的访问模式下打开具有指定名称的现有存储对象。 保留 000 到 01f 字符,用作流/存储名称的第一个字符,供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。 COM 提供的 IStorage::OpenStorage 方法的复合文件实现不支持以下行为:

  • 非根存储的STGM_PRIORITY标志。
  • 从同一父存储多次打开同一存储对象。 必须指定STGM_SHARE_EXCLUSIVE标志。
  • STGM_DELETEONRELEASE标志。 如果指定了此标志,则函数将返回STG_E_INVALIDFUNCTION。

IStorage::CopyTo

仅将此打开的存储对象的子存储和流复制到另一个存储对象中。 rgiidExclude 参数可以设置为 IID_IStream 仅复制子存储,或设置为 IID_IStorage 仅复制流。

IStorage::MoveElementTo

将子存储或流从此存储对象复制或移动到另一个存储对象。

IStorage::Commit

确保对以事务处理模式打开的存储对象所做的任何更改都反映在父存储中;表示根存储,反映实际设备中的更改;例如,磁盘上的 文件。 对于以直接模式打开的根存储对象,此方法除了将所有内存缓冲区刷新到磁盘之外没有效果。 对于直接模式下的非根存储对象,此方法不起作用。

除非 grfCommitFlags 参数中指定了 STGC_OVERWRITE,否则 COM 提供的复合文件实现使用两阶段提交过程。 此两阶段过程可确保数据的可靠性,以防提交操作失败。 首先,所有新数据都会写入基础文件中未使用的空间。 如有必要,将新空间分配给文件。 完成此步骤后,将使用单扇区写入操作更新文件中的表,以指示使用新数据来代替旧数据。 旧数据将成为下一个提交操作时使用的可用空间。 因此,旧数据可用,如果提交更改时发生错误,则可以还原旧数据。 如果指定了STGC_OVERWRITE,则使用单阶段提交操作。 有关事务处理模式标志的详细信息,请参阅 STGC 枚举。

IStorage::Revert

放弃自上次提交操作以来对存储对象所做的所有更改。

IStorage::EnumElements

创建并检索指向枚举器对象的指针,该枚举器对象可用于枚举此存储对象中包含的存储和流对象。 COM 提供的复合文件实现需要快照该信息。 因此,在获取新的枚举器之前,对流和存储的更改不会反映在枚举器中。

IStorage::D estroyElement

从此存储对象中删除指定元素 (子存储或流) 。

IStorage::RenameElement

重命名此存储对象中的指定子存储或流。 保留 000 到 01f 字符,用作流/存储名称的第一个字符,供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。

IStorage::SetElementTimes

设置指定存储元素的修改、访问和创建时间。 COM 提供的复合文件实现维护内部存储对象的修改和更改时间。 根存储对象支持基础文件系统 (或 ILockBytes) 支持的任何内容。 复合文件实现不维护内部流的任何时间戳。 不支持的时间戳报告为零,这允许调用方测试支持。

IStorage::SetClass

将指定的 CLSID 分配给此存储对象。

IStorage::SetStateBits

在此存储对象中存储最多 32 位的状态信息。 此方法设置的状态仅供外部使用。 COM 提供的复合文件实现不基于 状态执行任何操作。

IStorage::Stat

检索此打开的存储对象的 STATSTG 结构。

备注

如果在简单模式下打开存储对象,则限制使用上述方法。 如果使用 StgCreateStorageEx 或 StgOpenStorageEx 函数的 grfMode 参数中指定的 STGM_SIMPLE 元素打开存储,则存储处于简单模式。 有关简单模式存储的详细信息,请参阅 STGM 常量。 如果简单模式存储对象是从 StgCreateStorageEx 函数获取的,则可以调用 CreateStream 方法,但 OpenStream 方法不能。 如果简单模式存储对象是从 StgOpenStorageEx 函数获取的,则可以调用 OpenStream 方法,但 CreateStream 方法不能。

使用简单模式存储对象创建流时,该流的最小大小通常为 4096 字节。 如果写入流的数据较少,则大小将向上舍入为 4096 字节。

复合文件实现限制

IFillLockBytes

ILockBytes

IRootStorage

IStorage

IStream

StgCreateDocfile

StgCreateStorageEx

StgOpenStorage

StgOpenStorageEx