COM结构化存储

概述

结构化存储是为了解决在一个文件中存放多个数据对象的本质性困难。当修改一个对象从而改变其尺寸时，如果这些对象在文件内是顺序存放的，则被修改对象的尺寸扩大时所有在其后的对象都需要向后移动以腾出空间，被修改对象缩小尺寸时所有在其后的对象都需要向前移动。这样的困难有很多种办法应对，但应用程序开发者并不希望处理这样低层次的二进制文件格式问题。 
结构化存储把文件系统的概念引入到文件内部。在文件内部构造一个树状层次结构。由存储对象和流对象构成。根节点为根存储，根存储下面可以有子存储或流对象。子存储下面可以再有子存储或流对象。存储对象本身不包含信息，它是子存储和流对象的容器。流对象是叶子节点，是数据的载体。

简介

结构化存储提供了一种抽象，称为“流”（stream），用COM接口IStream表示。一个流在概念上类似一个文件，使用IStream接口的方法来读写。流可以存在于内存中、文件中，或其它流中。另外一个重要抽象是“storage”，表示为COM接口IStorage。一个storage在概念上类似于文件系统的目录。Storage可以包含流或其他storages。
一个应用程序如果要把几个数据对象保存到一个文件中，一种办法是打开一个IStorage以表示文件，然后把 每个对象存入单独的IStream（这可通过标准COM接口IPersistStream）。
结构化存储的事务机制，针对写模式而不是读模式。创建、打开存储和流时可以指定事务模式。只有Commit后，所有的变化才提交到上级。revert可以恢复到上次commit以来的状态。事务的实现是在内存中或临时文件中保存文件拷贝的方式。事务可以嵌套。
增量访问，可以减少保存文件的操作时间。对于文件碎片，调用根存储CopyTo解决。

IStream接口

class IStream::public IUnknown 
方法：
   Read
   Write
   Seek
   CopyTo
   Commit 把所有变化提交到包容该流对象的存储对象。
   Revert   rollback取消上次提交以来的所有操作。针对事务模式的流

IStorage接口

class IStorage：public IUnknown  
   CreateStream 
   OpenStream 操作子流对象，返回IStream接口指针CreateStorage 
   OpenStorage 操作子存储对象，返回IStorage接口指针EnumElements 枚举所有的子流对象和子存储对象。
   commit
   Revert。针对事务模式的存储。
   Stat 获取存储对象的CLSID标识符SetClass 为存储对象赋一个CLSID标识符，并可通过Stat函数获取此CLSID值。通过此CLSID值把存储对象与一段可执行代码联系起来，当客户程序希望执行与存储对象相联系的代码时，它利用CLSID值，并调用CoCreateInstamce函数创建一个COM对象，再把存储对象交给COM对象，由它处理存储对象。

Native Structured Storage

During the beta testing phase of Windows 2000, it included a feature titled Native Structured Storage (NSS) for storage of Structured Storage documents (like the binary Microsoft Office formats and the thumbs.db file Windows Explorer uses to cache thumbnails) with each Stream that makes up a document stored in a separate NTFS data stream. It included utilities that automatically split up the streams in a regular Structured Storage document into NTFS data streams and vice versa. However, the feature was withdrawn after Beta 3 due to incompatibilities with other OS components, and any NSS files automatically converted to the single data stream format.