复合文档(Compound Document)读写栗子
复合文件是把磁盘文件系统的管理方式移植到文件中---复合文件。
复合文档是由 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)读写栗子的更多相关文章
- 复合文档的二进制存储格式研究[ole存储结构](word,xls,ppt...)[转]
复合文档文件格式研究 前 言 复合文档(Compound Document) 是一种不仅包含文本而且包括图形.电子表格数据.声音.视频图象以及其它信息的文档.可以把复合文档想象成一个所有者,它装着 ...
- Atitit.复合文档的格式 标准化格式
Atitit.复合文档的格式 标准化格式 1. Docfile1 2. Iso Cdf cd file1 3. Zip1 4. Ooxml1 5. Odf :OpenDocument Form ...
- 深入理解DOM节点类型第七篇——文档节点DOCUMENT
× 目录 [1]特征 [2]快捷访问 [3]文档写入 前面的话 文档节点document,隶属于表示浏览器的window对象,它表示网页页面,又被称为根节点.本文将详细介绍文档节点document的内 ...
- Sharepoint学习笔记—ECM系列--文档集(Document Set)的实现
文档集是 SharePoint Server 2010 中的一项新功能,它使组织能够管理单个可交付文档或工作产品(可包含多个文档或文件).文档集是特殊类型的文件夹,它合并了唯一的文档集属性以及文件夹和 ...
- StgCreateDocfileOnILockBytes复合文档
CRichEditCtrl 的ole技术 ------------ IRichEditOle --------------------------- 如需向CRichEditCtrl里面插入Ole对象 ...
- <meta>指定浏览器模式(browser mode)或文档模式(document mode)无效
这是前两天解决的一个故障,准确的说它不是一个SharePoint的问题,而是IE8浏览器或者说是HTML代码的问题,但我感觉还是挺有意思的,所以贴上来分享一下. 基础知识 简单的讲,就是IE浏览器中有 ...
- JS判断doctype文档模式-document.compatMode
IE对盒模型的渲染在 Standards Mode和Quirks Mode是有很大差别的,在Standards Mode下对于盒模型的解释和其他的标准浏览器是一样,但在Quirks Mode模式下则有 ...
- 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 ...
- JS性能优化之创建文档碎片(document.createDocumentFragment)
讲这个方法之前,我们应该先了解下插入节点时浏览器会做什么. 在浏览器中,我们一旦把节点添加到document.body(或者其他节点)中,页面就会更新并反映出这个变化,对于少量的更新, ...
随机推荐
- canvas光晕
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Android:singleTask + onActivityResult
解决2个Activity互相跳转,并且栈中只保留每个Activity一个对象的存在. 在2个Activity中分别都要用到onActivityResult,所以就不能用launchMode=" ...
- 为 sublime text3 添加 github 上的插件
1.CMD+SHIFT+P ---> ADD REPOSITORY 输入 github 上的地址 https://github.com/akira-cn/sublime-gbk 2.CMD+SH ...
- Timer使用
1. Timer简介 Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次. 通过创建Timer对象,然后调用Time ...
- Fiddler-抓取安卓手机APP请求地址
第一步:下载神器Fiddler,下载链接: http://fiddler2.com/get-fiddler 下载完成之后,傻瓜式的安装一下了! 第二步:设置Fiddler打开Fiddler, ...
- 计算机原理--cpu篇
简介 本文的目的是为了能够对特定的计算模型估算所需的CPU规格,个数. 这里主要介绍CPU的基本工作原理,指令集.(仅以X86体系结构的CPU为例 )
- Team Foundation Server安装指南(转载)
1.说明 Team Foundation Server(以下简称VSTF)的安装并不是一件轻松的事情,在安装的过程中相信很多人都或多或少碰到一些问题而安装不成功,虽然手头有微软提供的所谓安装手册,也曾 ...
- Linux中history历史命令使用方法详解
当你在玩Linux的时候,如果你经常使用命令行来控制你的Linux系统,那么有效地使用命令历史机制将会使效率获得极大提升.事实上,一旦你掌 握了我在下面给出的15个有关Linux history历史命 ...
- atitit.jquery tmpl模板总结 .doc
atitit.jquery tmpl模板总结 .doc 1. atitit.动态模版解析1 1.1. Jquery.tmpl.js1 1.2. 比起anrular js方便啊.1 2. 动态模板引擎解 ...
- 由上而下层层剖析细说PCI+ExpresS+11新版精髓
https://wenku.baidu.com/view/9a16c41fa300a6c30c229f87.html