结构化存储接口

结构化存储服务分为三类 接口。 每个集表示复合文件、它包含的对象以及存储这些单独组件的物理介质之间的连续间接或抽象级别。

第一类接口由 IStorageIStreamIRootStorage 组成。 前两个接口定义对象在复合文件中的存储方式。 这些接口提供用于打开存储元素、提交和还原更改、复制和移动元素以及读取和写入流的方法。 这些接口无法识别各个对象的本机数据格式,因此没有将这些对象保存到持久存储的方法。 IRootStorage 接口有一种方法,用于将复合文档与基础文件系统名称相关联。 客户端必须为其复合文件实现这些接口。

第二类接口由 IPersist 接口组成,对象实现这些接口来管理其持久数据。 这些接口提供读取各个对象的数据格式的方法,因此知道如何存储它们。 对象负责实现这些接口,因为客户端不知道其嵌套对象的本机数据格式。 但是,这些接口不了解特定的物理存储介质。

第三类由单个接口 ILockBytes 组成,该接口提供将文件写入特定物理介质(如硬盘或磁带驱动器)的方法。 但是,大多数应用程序不会实现 ILockBytes 接口,因为 COM 已经为两种最常见的情况(基于文件的实现和基于内存的实现)提供了实现。 复合文件存储对象调用 ILockBytes 方法,你不会在实现中直接调用它们。

复合文件实现限制

结构化存储体系结构的 COM 实现称为 复合文件。 复合文件中实现的存储对象包括 IPropertyStorageIPropertySetStorage 接口的实现。

通过调用 StgCreateStorageEx 函数创建新的复合文件对象或 调用 StgOpenStorageEx 打开以前创建的复合文件来获取指向这些接口的复合文件实现的指针。

获取指向这些接口的复合文件实现的指针的另一种方法是调用较旧且限制性更高的 StgCreateDocfileStgOpenStorage 函数。 所有四个函数都被视为复合文件实现。

复合文件实现可以配置为使用 512 或 4096 字节扇区,如 STGOPTIONS 结构中定义。

复合文件的复合文件实现受以下实现约束的约束。

限制 复合文件
文件大小限制: 512:2 GB (GB) 4096:高达文件系统限制
打开的元素所需的最大堆大小: 512:4 兆字节 (MB) 4096:最高为虚拟内存限制
并发根打开 (打开同一文件) : 如果指定了STGM_READ和STGM_SHARE_DENY_WRITE,则限制由文件系统限制决定。 否则,同一文件的并发根打开数限制为 20 个。
文件中的元素数: 512:无限制,但如果元素数在千 4096 中,性能可能会降低

由于 4 MB 堆大小限制,事务处理模式下打开的元素数通常限制为数千个元素。