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

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

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

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

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

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

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

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

  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <assert.h>
  4. #include <tchar.h>
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9. ::CoInitialize(NULL); //COM初始化
  10. HRESULT hr; //函数指向返回值
  11. IStorage *pStg = NULL; //根存储接口指针
  12. IStorage *pSub = NULL; //子存储接口指针
  13. IStream *pStm = NULL; //流接口指针
  14.  
  15. //创建复合文件
  16. hr = ::StgCreateDocfile(_T("C:\\a.stg"), STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE, , &pStg);
  17. assert(SUCCEEDED(hr));
  18.  
  19. //建立子存储
  20. hr = pStg->CreateStorage(_T("SubStg"), STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE, , , &pSub);
  21. assert(SUCCEEDED(hr));
  22.  
  23. //建立流
  24. hr = pSub->CreateStream(_T("stm"), STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE, , , &pStm);
  25. assert(SUCCEEDED(hr));
  26.  
  27. //向流中写入数据
  28. hr = pStm->Write(_T("Hello IStorage"), , NULL);
  29. assert(SUCCEEDED(hr));
  30.  
  31. //释放指针
  32. if(pStm) pStm->Release();
  33. if(pSub) pSub->Release();
  34. if(pStg) pStg->Release();
  35.  
  36. //指针重新初始化
  37. pStg = NULL;
  38. pSub = NULL;
  39. pStm = NULL;
  40.  
  41. //打开复合文档
  42. hr = ::StgOpenStorage(_T("C:\\a.stg"), NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, , &pStg);
  43. assert(SUCCEEDED(hr));
  44.  
  45. //打开一个目录
  46. hr = pStg->OpenStorage(_T("SubStg"), NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, , &pSub);
  47. assert(SUCCEEDED(hr));
  48.  
  49. //准备读取数据
  50. hr = pSub->OpenStream(_T("stm"), NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, , &pStm);
  51. assert(SUCCEEDED(hr));
  52.  
  53. //读取数据
  54. TCHAR strText[] = {}; //必须指定初始值,否则会显示出乱码,也可以设为 '/0'
  55. ULONG actRead = ;
  56. hr = pStm->Read(strText, //存放放入的数据的缓冲区
  57. , //要读入数据的长度,如不清楚可以设为较大的数
  58. &actRead //实际读入的长度
  59. );
  60.  
  61. //显示读取结果
  62. cout << "读取的数据结果为:";
  63. wcout << strText << endl;
  64. cout << "指定读入数据的长度:" << << endl;
  65. cout << "实际读入的数据长度:" << actRead << endl;
  66.  
  67. ::CoUninitialize(); //释放COM
  68.  
  69. cin.get();
  70. return ;
  71. }

复合文档(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. Java之架构(0) - 架构之路

    软件架构作为一个概念,体现在技术和业务两个方面. 从技术角度来说:软件架构随着技术的革新不断地更新其内容,软件架构建立于当前技术和一些基本原则的基础之上. 先说一些基本原则: 分层原则:分层是为了降低 ...

  2. Spring入门示例

    开发环境 Spring 4.3.0+Myeclipse2015+JDK1.8 准备阶段: 1.新建一Spring01项目,然后新建一个lib文件.将下面的添加到lib文件中 2.将lib文件所有的包导 ...

  3. AES + RSA + Hash 实现 C-S 安全交互

    概述 AES 由于其执行速度快,易于硬件实现,破解难度大等优势,被广泛用于数据的加密. 既然是对称加密,那如何保证秘钥的安全传输?很容易想到用 RSA 加密秘钥.由于只能用私钥解密,而私钥不需要交互双 ...

  4. HDOJ 5418 Victor and World 状压DP

    水状压DP Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java ...

  5. Freeswitch中文用户手册(第四章 SIP)----2

    通过 B2BUA 呼叫 在真实世界中,bob 和 alice 肯定要经常改变位置,那么它们的 SIP 地址也会相应改变,并且,如果他们之中有一个或两个处于 NAT 的网络中时,直接通信就更困难了.所以 ...

  6. Atitit.遍历图像像素点rgb java attilax总结

    Atitit.遍历图像像素点rgb java attilax总结 1. 遍历像素点 1 2. 提取一行 1 3. Rgb分量提取 2 4. 其他读取像素 3 5. --code 5 6. 参考 6 1 ...

  7. atitit.浏览器插件解决方案----ftp插件 attilax 总结

    atitit.浏览器插件解决方案----ftp插件  attilax 总结 1. 界面概览  D:云盘同步文件夹p5p5f tp.demo.html1 2. 初始化1 3. 事实调用2 4. 参考2 ...

  8. Cannot change version of project facet Dynamic Web Module to 3.0 requires Java 1.6 or newer 解决方案

    Eclipse Maven 开发一个 jee 项目时,编译时遇到以下错误:Description Resource Path Location TypeDynamic Web Module 3.0 r ...

  9. hive2.1.1配置

    hive2.1.1配置 首先在conf下复制hive-site.xml <property> <name>javax.jdo.option.ConnectionURL</ ...

  10. java模拟http请求上传文件,基于Apache的httpclient

    1.依赖 模拟http端的请求需要依赖Apache的httpclient,需要第三方JSON支持,项目中添加 <dependency> <groupId>org.apache& ...