COM编程之复合文件

来源:互联网 发布:手机淘宝如何快速抢购 编辑:程序博客网 时间:2024/05/21 16:56

1. 原理:磁盘文件组织方式与复合文件组织方式:

2. 工具:VC自带的“复合文件浏览器”:DFView(没有实现国际化,文件全路径名不得出现中文)

3. 方法:

WIN API 函数

功能说明

StgCreateDocfile()建立一个复合文件,得到根存储对象StgOpenStorage()打开一个复合文件,得到根存储对象StgIsStorageFile()判断一个文件是否是复合文件

 

IStorage 函数

功能说明

CreateStorage()在当前存储中建立新存储,得到子存储对象CreateStream()在当前存储中建立新流,得到流对象OpenStorage()打开子存储,得到子存储对象OpenStream()打开流,得到流对象CopyTo()复制存储下的所有对象到目标存储中,该函数可以实现“整理文件,释放碎片空间”的功能MoveElementTo()移动对象到目标存储中DestoryElement()删除对象RenameElement()重命名对象EnumElements()枚举当前存储中所有的对象SetElementTimes()修改对象的时间SetClass()在当前存储中建立一个特殊的流对象,用来保存CLSID(注5)Stat()取得当前存储中的系统信息Release()关闭存储对象 

IStream 函数

功能说明

Read()从流中读取数据Write()向流中写入数据Seek()定位读写位置SetSize()设置流尺寸。如果预先知道大小,那么先调用这个函数,可以提高性能CopyTo()复制流数据到另一个流对象中Stat()取得当前流中的系统信息Clone()克隆一个流对象,方便程序中的不同模块操作同一个流对象Release()关闭流对象 WIN API 补充函数功能说明WriteClassStg()写CLSID到存储中,同IStorage::SetClass()ReadClassStg()读出WriteClassStg()写入的CLSID,相当于简化调用IStorage::Stat()WriteClassStm()写CLSID到流的开始位置ReadClassStm()读出WriteClassStm()写入的CLSIDWriteFmtUserTypeStg()写入用户指定的剪贴板格式和名称到存储中ReadFmtUserTypeStg()读出WriteFmtUserTypeStg()写入的信息。方便应用程序快速判断是否是它需要的格式数据。CreateStreamOnHGlobal()内存句柄 HGLOBAL 转换为流对象GetHGlobalFromStream()取得CreateStreamOnHGlobal()调用中使用的内存句柄

4. 源码1:写一个复合文件

5. 源码2:读一个复合文件

    需要加入头文件:

   函数体:

6. 扩展

   MsgEx.db为QQ聊天记录的内容,我们可以用DFView查看,但是是十六进制的,要经过解码

原创粉丝点击