复合文档(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(或者其他节点)中,页面就会更新并反映出这个变化,对于少量的更新, ...
随机推荐
- ZK框架笔记5、事件
事件是org.zkoss.zk.ui.event.Event类,它通知应用程序发生了什么事情.每一种类型的事件都由一个特定的类来表示. 要响应一个事件,应用程序必须为事 ...
- 【Linux命令】ls命令
ls命令是Linux最常用的命令,ls命令就是list的缩写,主要作用是:打印出当前目录的清单.如果ls指定其他目录,那么就会显示指定目录下的清单. 1.命令格式 ls [选项] [目录名] 2.命令 ...
- 03-spring学习-属性配置细节
配置bean的一些细节 字面值 如果包含特殊符号,直接写会报错.可以用这个<![CDATA[]]>包裹起来. 比如这里的配置属性里面的value值包含<>等特殊符号,直接写会报 ...
- nginx听课随记杂记
今天听了个公开课,里面讲了异步非阻塞,说的不是很清楚,网上有个人写的很好:http://blog.csdn.net/feitianxuxue/article/details/8936802 提到了用n ...
- c++继承总结
继承 1)继承是面向对象程序设计实现软件重用的重要方法.程序猿能够在已有基类的基础上定义新的派生类. 2) 单继承的派生类仅仅有一个基类.多继承的派生类有多个基类. 3) 派生类对基类成员的訪问由继承 ...
- 深入理解linux系统的目录结构
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- Xcode中利用git源代码版本号控制
git是一个版本号控制系统,能够通过命令行来调用,也有专门的桌面软件.这里主要介绍在Xcode中怎样利用git来进行版本号的控制. 一.创建git源 从Xcode5開始引入了使用git的一些新特性.将 ...
- php 验证访问浏览器是电脑还是手机
//判断如果为手机用户则 if(checkmobile()==true) { $url=$_SERVER["HTTP_HOST"]; $urlHost=GetHost($url); ...
- atitit.验证码识别step4--------图形二值化 灰度化
atitit.验证码识别step4--------图形二值化 灰度化 1. 常见二值化的方法原理总结 1 1.1. 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于12 ...
- C# 冒泡排序
class Program { static void swap( ref int atemp, ref int btemp)//注意ref的使用 { int temp = atemp; atemp ...