复合文件是把磁盘文件系统的管理方式移植到文件中---复合文件。   

  复合文档是由 Windows 系统通过 COM 提供的, 它能完成像 Windows 目录结构一样复杂的文件结构的存取;提示一下 Windows 的目录结构: 一个目录下可以包含子目录和文件, 然后层层嵌套...

  有时我们要存储的文件也可能会层层分支, 具体的文件内容也可能五花八门, 譬如分支当中的某个文件是张图片、是一个字符串列表、是一个记录(或叫结构)等等, 存储这样的文件内容恐怕用数据库也是无能为力的。

  或许有了这个东西, 出品属于自己的文件格式就成了轻而易举的事情了。

  存取和访问复合文档主要使用定义在 Activex 的三个 COM 接口:

  IStorage (类似于 Windows 的目录, 也就是文件夹);

  IStream (类似于目录中的文件, 不过在这里都是"流", 每个流至少要占用 512 字节);

  IEnumStatStg (用于列举 IStorage 的层次结构)

#include <iostream>
#include <Windows.h>
#include <assert.h>
#include <tchar.h>
using namespace std; int main()
{
::CoInitialize(NULL); //COM初始化
HRESULT hr; //函数指向返回值
IStorage *pStg = NULL; //根存储接口指针
IStorage *pSub = NULL; //子存储接口指针
IStream *pStm = NULL; //流接口指针 //创建复合文件
hr = ::StgCreateDocfile(_T("C:\\a.stg"), STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE, , &pStg);
assert(SUCCEEDED(hr)); //建立子存储
hr = pStg->CreateStorage(_T("SubStg"), STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE, , , &pSub);
assert(SUCCEEDED(hr)); //建立流
hr = pSub->CreateStream(_T("stm"), STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE, , , &pStm);
assert(SUCCEEDED(hr)); //向流中写入数据
hr = pStm->Write(_T("Hello IStorage"), , NULL);
assert(SUCCEEDED(hr)); //释放指针
if(pStm) pStm->Release();
if(pSub) pSub->Release();
if(pStg) pStg->Release(); //指针重新初始化
pStg = NULL;
pSub = NULL;
pStm = NULL; //打开复合文档
hr = ::StgOpenStorage(_T("C:\\a.stg"), NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, , &pStg);
assert(SUCCEEDED(hr)); //打开一个目录
hr = pStg->OpenStorage(_T("SubStg"), NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, , &pSub);
assert(SUCCEEDED(hr)); //准备读取数据
hr = pSub->OpenStream(_T("stm"), NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, , &pStm);
assert(SUCCEEDED(hr)); //读取数据
TCHAR strText[] = {}; //必须指定初始值,否则会显示出乱码,也可以设为 '/0'
ULONG actRead = ;
hr = pStm->Read(strText, //存放放入的数据的缓冲区
, //要读入数据的长度,如不清楚可以设为较大的数
&actRead //实际读入的长度
); //显示读取结果
cout << "读取的数据结果为:";
wcout << strText << endl;
cout << "指定读入数据的长度:" << << endl;
cout << "实际读入的数据长度:" << actRead << endl; ::CoUninitialize(); //释放COM cin.get();
return ;
}

复合文档(Compound Document)读写栗子的更多相关文章

  1. 复合文档的二进制存储格式研究[ole存储结构](word,xls,ppt...)[转]

    复合文档文件格式研究   前 言 复合文档(Compound Document) 是一种不仅包含文本而且包括图形.电子表格数据.声音.视频图象以及其它信息的文档.可以把复合文档想象成一个所有者,它装着 ...

  2. Atitit.复合文档的格式 标准化格式

    Atitit.复合文档的格式 标准化格式 1. Docfile1 2. Iso   Cdf  cd file1 3. Zip1 4. Ooxml1 5. Odf  :OpenDocument Form ...

  3. 深入理解DOM节点类型第七篇——文档节点DOCUMENT

    × 目录 [1]特征 [2]快捷访问 [3]文档写入 前面的话 文档节点document,隶属于表示浏览器的window对象,它表示网页页面,又被称为根节点.本文将详细介绍文档节点document的内 ...

  4. Sharepoint学习笔记—ECM系列--文档集(Document Set)的实现

    文档集是 SharePoint Server 2010 中的一项新功能,它使组织能够管理单个可交付文档或工作产品(可包含多个文档或文件).文档集是特殊类型的文件夹,它合并了唯一的文档集属性以及文件夹和 ...

  5. StgCreateDocfileOnILockBytes复合文档

    CRichEditCtrl 的ole技术 ------------ IRichEditOle --------------------------- 如需向CRichEditCtrl里面插入Ole对象 ...

  6. <meta>指定浏览器模式(browser mode)或文档模式(document mode)无效

    这是前两天解决的一个故障,准确的说它不是一个SharePoint的问题,而是IE8浏览器或者说是HTML代码的问题,但我感觉还是挺有意思的,所以贴上来分享一下. 基础知识 简单的讲,就是IE浏览器中有 ...

  7. JS判断doctype文档模式-document.compatMode

    IE对盒模型的渲染在 Standards Mode和Quirks Mode是有很大差别的,在Standards Mode下对于盒模型的解释和其他的标准浏览器是一样,但在Quirks Mode模式下则有 ...

  8. JAVA读取XML,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析(Document Object Model, DOM)

    使用Document Object Model, DOM解析XML文档 也可参考我的新浪博客:http://blog.sina.com.cn/s/blog_43ac5543010190w3.html ...

  9. JS性能优化之创建文档碎片(document.createDocumentFragment)

    讲这个方法之前,我们应该先了解下插入节点时浏览器会做什么.         在浏览器中,我们一旦把节点添加到document.body(或者其他节点)中,页面就会更新并反映出这个变化,对于少量的更新, ...

随机推荐

  1. jQuery实现滚动栏一直处于最底部

    相信大家有时候在展示一些实时数据展示并且数据量非常大的时候,由于无法在同一页面看到最有效的数据,所以我们须要将滚动栏至于底部.以便我们看到最须要的数据和信息.这里非常明显的样例那拿windows的pi ...

  2. DOM BOM document window 区别

    DOM 是为了操作文档出现的 API,document 是其的一个对象: BOM 是为了操作浏览器出现的 API,window 是其的一个对象.   使用下图讲解:   归DOM管的: E区:即doc ...

  3. 剑指OFFER之二叉搜索树与双向链表(九度OJ1503)

    题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数 ...

  4. LoadRunner参数化时的各个选项说明

    LoadRunner参数化时的各个选项说明 分类: LoadRunner 2009-03-27 09:32 6294人阅读 评论(1) 收藏 举报 loadrunnerrandomgeneratore ...

  5. 前端纯css 图片的模糊处理

    最近做的一个项目需要用到背景图的模糊处理,在网上查资料,发现用css的 filter 属性就可以解决,但是因为模糊度比较高,四周会有很长的模糊边,百度上也没找到解决的方法,,可喜的是最后我在分析一个d ...

  6. jBoss无法通过IP地址访问,只能用localhost\127.0.0.1访问

    http://feng88724.iteye.com/blog/263211 JBOSS版本:4.2.2GA 症状:服务器无法通过IP地址去访问,只能用127.0.0.1或者localhost来访问. ...

  7. phpexcel表的一些设置

    $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); //set default styles$objPHPE ...

  8. tcp_recvmsg 函数具体解释

    看了非常多网上关于tcp_recvmsg的文章,感觉解释的不太到位,或者非常多都是空口说白话,昨天分析了一下午tcp_recvmsg.感觉了解了十之八九,如今贴出来和大家分享一下. 须要背景:了解tc ...

  9. C# 中字符串string和字节数组byte[]的转换

    string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]转string: stri ...

  10. Java并发编程(六):Java里实现对象安全发布的四种方式

    接上篇,首先要了解什么是对象的发布与逸出? Java里安全发布对象的四种方法1.单例(注意懒汉和饿汉的区别)2.静态属性,注意类里的静态域和静态代码块的顺序有要求3.枚举4.final