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

  复合文档是由 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. H5 Canvas | 画布中变量作用域与setInterval方法同步执行探究

    Demo - 随机绘制圆环 实现思路: 将一个圆环的绘制分成100份,setInterval()方法定义每隔时间n绘制一段新的,每份的开始路径都是上一次的结束路径,实现步进绘制. 通过Math.ran ...

  2. docker 中 安装 openssh-server

    1,首先,需要从docker官网获得centos或Ubuntu镜像 2,当本地已有Ubuntu镜像后(大概200M左右大小),使用如下命令 docker run -t -i ubuntu /bin/b ...

  3. Java Jaxb JavaBean与XML互转

    1.Jaxb - Java Arcitecture for XML Binding 是业界的一个标准,是一项能够依据XML Schema产生Java类的技术. Jaxb2.0是Jdk1.6的组成部分. ...

  4. MSSQL中循环

    1 declare @result table 2 ( 3 custid int, 4 ordermonth datetime, 5 qty int, 6 runqty int, 7 primary ...

  5. C语言-结构体内存对齐

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  6. javascript中call apply的区别

    obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1, arg2, ...]); 两者作用一致,都是把obj(即this)绑定到th ...

  7. 将ViewState放在Session里(转载)

    using System; using System.Collections.Generic; using System.Linq; using System.Web;   namespace Ent ...

  8. 当 ftp 遇上 http Proxy

    在asp.net 开发中,有时需要使用到ftp 上传文件, 如果客户电脑使用http proxy 上网, 那么,客户电脑在使用ftp上传文件时,可能会出现以下错误: 使用 HTTP Proxy 時,不 ...

  9. 利用putty的pscp命令上传文件

    1.有的时候,本地下载源码包的速度快过vps(主要指国内),那么可以用迅雷下载后上传到vps. 2.为了这么点事情,专门安装一个ftp软件,太麻烦,于是想到了putty贴心的pscp小程序. 3.首先 ...

  10. Vivado Logic Analyzer的进一步探讨

    本文基于Vivado 2014.2,代码基于文章http://blog.chinaaet.com/detail/37239中使用的代码. 这一篇仅讨论在综合后的Netlist中选择信号进行捕获的方法. ...