关于COM中的复合文档

关于COM中的复合文档
 

关于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;
}

时间: 2024-08-03 12:37:05

关于COM中的复合文档的相关文章

Win7系统如何在excel中添加word文档结构图

  Win7系统如何在excel中添加word文档结构图          方法一: Word提供了一个很方便的功能--文档结构图,通过文档结构图可以在整个文档中快速浏览并追踪特定的文件内容位置.文档结构图是一个独立的窗口,类似于大纲视图,它能够显示文档的标题,单击文档结构图中的标题后,Word就会自动转到文档中的相应标题,并将其显示在窗口的顶部.用户可以单击菜单""视图"-"文档结构图"来打开它.但是EXCEL中没有提供文档结构图,那么如何管理数据量较大

Java编程中更新XML文档的常用方法

xml|编程 本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析这四种方法的优劣.其次,本文还对如何控制Java程序输出的XML文档的格式做了展开论述. JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口.JAXP支持DOM.SAX.XSLT等标准.为了增强JAXP使用上的灵活性,开发者特别为JAXP设计了一个Pluggability Layer,在Pluggability Laye

如何在delphi中使用xml文档

在delphi中使用xml文档有两种方法,一是使用delphi 内置的xml broker:一是使用msxml.dll . 一  使用xml broker, 是delphi 内置的 例: unit ShowXML; interface uses Classes HTTPApp Db DbClient Midas XMLBrokr WebComp MidItems; type TCustomShowXMLButton = class(TXMLButton IScriptComponent) pro

C++程序中导出Word文档的方法

如果您要在应用程序中处理Word文档,可以参考MSDN. Lori Turner. Automating Microsoft Office 97 and Office 2000,该文内容详细全面,但是要在C++程序中导出Word文档,按照文中的方法来处理是很麻烦的,特别是需要填写的参数太多. 所以我们考虑生成正确的VB脚本,然后执行生成Word文档的操作,这个方法的优点在于:一方面可以少填写参数:另一方面可以使用在Word中录制的宏脚本,而只需作少量的修改.我们给出了一些简单的函数来方便生成Wo

在Word 2010中设置Word文档属性信息

Word文档属性包括作者.标题.主题.关键词.类别.状态和备注等项目,关键词属性属于Word文档属性之一.用户通过设 置Word文档属性,将有助于管理Word文档.在Word 2010中设置Word文档属性的步骤如下所述: 第1步,打开Word 2010文档窗口,依次单击"文件"→"信息"按钮.在打开的"信息 "面板中单击"属性"按钮,并在打开的下拉列表中选择"高级属性"选项,如图2009121214所示

在Word 2010文档窗口中打开WPS文档

Word 2010支持WPS文件的打开和编辑,用户可以在Word 2010文档窗口中打开并编辑WPS文件.即使是金山软件最新版本的WPS2009文档,Word 2010也能提供完美支持.在Word 2010中打开WPS文件的步骤如下所述: 第1步,打开Word 2010文档窗口,依次单击"文件"→"打开"按钮,如图2009121201所示.   图2009121201 单击"打开"按钮 第2步,在打开的"打开"对话框中,单击文

在Word 2010文档窗口中查看Word文档被修改次数

用户可以在Word文档的属性对话框中查看Word文档被修改的次数,从而了解该Word文档被修订的情况.在Word 2010文档窗口 中查看Word文档被修改次数的步骤如下所述: 第1步,打开Word 2010文档窗口,依次单击"文件"→"信息"按钮.在"信息"面 板中单击"属性"按钮,然后在打开的下拉列表中选择"高级属性"选项,如图2009121212所示. 图2009121212 选 择"高级属

在Word 2010中创建新建文档超链接

在Word 2010文档中创建链接到其他Word文档的超链接时,既可以在已有Word文档之间创建超链接,也可以在原有Word文档中 创建超链接的同时新建Word文档.在Word 2010文档中创建新建文档超链接的步骤如下所述: 第1步,打开Word 2010文档窗口,选中需要创建超链接的文字(参考教程<在Word 2010文档中创建文本超链接>).切换到 "插入"功能区,在"链接"分组中单击"超链接"按钮,如图2011081201所示

压缩包中的Word文档无法自动更新

当压缩包(rar或zip)中的某一文件需要修改时,我们一般都是在打开压缩包之后,用鼠标双击要修 改的文件,这时系统会自动调用关联程序将其打开,在修改完毕之后,保存该文件,切换到压缩包中,此 时会弹出"文件已修改,是否更新"的询问,单击"是"即可自动更新压缩包中修改过的文件. 在修改Winrar压缩包中的Word文档后,有时候不会自动更新,您可以按如下过程试试:先运行Word, 再打开rar压缩包,双击其中的Word文档,这时Word文档会被已经运行的Word程序自动