结构化存储接口
结构化存储服务分为三类 接口。 每个集表示复合文件、包含的对象以及存储这些各个组件的物理介质之间的连续间接或抽象级别。
第一类接口包括 IStorage、IStream和 IRootStorage。 前两个接口定义如何在复合文件中存储对象。 这些接口提供打开存储元素、提交和还原更改、复制和移动元素以及读取和写入流的方法。 这些接口无法识别各个对象的本机数据格式,因此没有将这些对象保存到持久性存储的方法。 IRootStorage 接口具有单个方法,用于将复合文档与基础文件系统名称相关联。 客户端必须为其复合文件实现这些接口。
第二类接口由 IPersist 接口组成,这些接口对象实现这些接口来管理其持久性数据。 这些接口提供读取各个对象的数据格式的方法,因此知道如何存储它们。 对象负责实现这些接口,因为客户端不知道其嵌套对象的本机数据格式。 但是,这些接口不了解特定的物理存储介质。
第三个类别由单个接口(ILockBytes)组成,该接口提供将文件写入特定物理介质(如硬盘或磁带驱动器)的方法。 但是,大多数应用程序不会实现 ILockBytes 接口,因为 COM 已经为两种最常见的情况(即基于文件的实现和基于内存的实现)提供了实现。 复合文件存储对象调用 ILockBytes 方法,你不会直接在实现中调用它们。
复合文件实现限制
结构化存储体系结构的 COM 实现称为 复合文件。 在复合文件中实现的存储对象包括 IPropertyStorage 和 IPropertySetStorage 接口的实现。
通过调用 StgCreateStorageEx 函数创建新的复合文件对象,或 StgOpenStorageEx 打开以前创建的复合文件来获取这些接口的复合文件实现的指针。
获取指向这些接口复合文件实现的指针的替代方法是调用较旧的、更有限的 StgCreateDocfile 或 StgOpenStorage 函数。 这四个函数都被视为复合文件实现。
复合文件实现可配置为使用 512 或 4096 字节扇区,如 STGOPTIONS 结构中定义。
复合文件的复合文件实现受以下实现约束的约束。
限制 | 复合文件 |
---|---|
文件大小限制: | 512:2 GB(GB) 4096:高达文件系统限制 |
打开元素所需的最大堆大小: | 512:4 兆字节(MB)4096:最大虚拟内存限制 |
并发根打开(同一文件打开): | 如果指定了STGM_READ和STGM_SHARE_DENY_WRITE,则限制由文件系统限制决定。 否则,同一文件的并发根数限制为 20 个。 |
文件中的元素数: | 512:无限制,但如果元素数在数千个 4096 中,性能可能会下降:无限制 |
由于 4 MB 堆大小限制,事务模式下打开的元素数通常限制为数千个元素。