中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > ATL/COM/ActiveX
关于COM中的复合文档
作者:yarshray 时间:2001-10-04 09:53 出处:互联网 责编:chinaitpower
              摘要:关于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;
}


希望对各位有点帮助,希望大家对指教.(完)

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有