关于COM中的复合文档
结构化的存储
在永久存储机制下,普通文件都是用字节组织的.每个文件都是没有次序的字节组成的. 而整个文件则是一块的形式存储在磁盘中的,并且每个块都是离散的.当你要读某个文件的时候文件系统会管理它的指针并返回要读取的字节流.
COM采用另一种更为合理的方法来存储文件和数据.这种方式就叫结构化存储.结构化存储
采用的办法是把文件预先加工后存储在一个文档结构中.这里要使用两个COM对象.storages
和streams.storage对象很类似与文件系统中的目录,它可以包含其它的storage对象和stream
对象.你可以把stream对象理解成文件系统中的文件.和文件一样,stream对象包含数据,stored
则象一个连续的字节块.每一个复合文档都包含以上两个对象.COM通过两个借口来访问上面两个对 IStorage和IStream.
为什么我们需要结构化存储
是的,要知道你的复合文档中包括,图象,文字,等等其它一些数据.好啦,现在你大概希望把它们
放到一起去.以前的做法是当你要保存文件的时候,文件系统会把原文件重写从而把你的新的资料
加入进来.听上去很花时间和精力是吗是的,所结构化处理采用另外一个办法.新的数据存储到
老的数据后面.是的就想文件系统那样存放到新的文件夹那样所不同的是它使用的是storage对象
和stream对象.下面看看它给我们带来了什么好处
1.结构化存储能够让你完全控制每一个独立的对象,每次读/写你不必去读写整个文件,而可以读/写你
想要的段落.
2.并且一个用户可以并发的读/写同一个文件
复合文档:就是把不同类型的数据存储在一个文件中.如一个word文件可以包括excel的图表,图象
表格,或者其它数据.
现在让我们来看它的两个接口
IStorage 接口
如你所想的那样它就象文件系统中的目录.
IStream 接口
它用来读/写数据到stream对象.
你可以到MSDN上查找到相应的文档.
最后让我们举个例子,来看看他们是如何工作的.
步骤如下:
1.首先要调用StgCreateDocfile函数来创建一个存储根对象.我们的复合文件要
存储每一个存储对象和流对象.StgCreateDocfile函数返回一个IStorage接口指针
2.调用IStorage的CreateStream来创建一个流对象.该函数返回一个IStream的指针
3.最后调用IStream的wirte函数来写如流.
源代码如下:
#include <objbase.h.>
int main(int argc, char* argv[])
{
CoInitialize(NULL);
IStorage* pStr;
HRESULT hr = StgCreateDocfile( L"test.mcb", STGM_DIRECT|STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, &pStr);
IStream* pStream;
hr = pStr->CreateStream( L"mcbStream", STGM_DIRECT|STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, 0, &pStream );
ULONG name;
char data[] = "Mahesh testing " ;
pStream->Write( data, strlen(data), &name ) ;
CoUninitialize();
return 0;
}