没有合适的资源?快使用搜索试试~ 我知道了~
COM 组件设计与应用(word 2010版)
3星 · 超过75%的资源 需积分: 10 9 下载量 149 浏览量
2011-12-08
17:20:53
上传
评论
收藏 3.54MB DOCX 举报
温馨提示
试读
64页
重新编排的COM 组件设计与应用 word可直接打印版,去掉了网页头那些烦人的东西。
资源推荐
资源详情
资源评论
COM 组件设计与应用(一)
起源及复合文件
作者:杨老师
一、前言
公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写
程序就和搭积木一样啦。你赶快学习一些 的技术吧,当时我心里就寻思 :
“开什么玩笑?搭积木方式写程序?再过 年吧,但作为一名听话的好学生,
我开始在书店里“踅摸”(注 )有关 的书籍(注 )。功夫不负有心人,终于买
到了我的第一本 书《高级编程技术》,这本 多页的大布头花费了
我 的月工资呀于是开始日夜耕读
功夫不负有心人,我坚持读完了全部著作,感想是:这本书,在说什么呐?
功夫不负有心人,我又读完了一遍大布头,感想是:咳,没懂!
功夫不负有心人,我再,我再我再读 感想是:哦,读懂了一点点啦,哈哈
哈。
功夫不负有心人,我终于,我终于懂了。
页的书对现在的我来说,其实也就 几页有用。到这时候才体会出什么叫“书
越读越薄”的道理了。到后来,能买到的书也多了,上网也更方便更便宜了
为了让 上的朋友,不再经历我曾经的痛苦、不再重蹈我“无头苍蝇”般
探索的艰辛、为了 的蓬勃发展、为了中国软件事业的腾飞(糟糕,吹的
太也高了)我打算节约一些在 上赚分的时间,写个系列论文,就叫“
组件设计与应用”吧。今天是第一部分——起源。
二、文件的存储
传说 年前,牛顿被苹果砸到了头,于是发现了万有引力。但到了二十一世
纪的现在,任何一个技术的发明和发展,已经不再依靠圣人灵光的一闪。技术的进
步转而是被社会的需求、商业的利益、竞争的压力、行业的渗透等推动的。微软在
平台上的组件技术也不例外,它的发明,有其必然因素。什么是这个因素
那?答案是——文件的存储。
打开记事本程序,输入了一篇文章后,保存。——这样的文件叫“非结构化文件”;
打开电子表格程序,输入一个班的学生姓名和考试成绩,保存。——这样的文
件叫“标准结构化文件”;
在我们写的程序中,需要把特定的数据按照一定的结构和顺序写到文件中保存。
——这样的文件叫“自定义结构化文件”;(比如 !文件)
以上三种类型的文件,大家都见的多了。那么文件存储就依靠上述的方式能满
足所有的应用需求吗?恩,至少从计算机发明后的 多年来,一直是够用的
了。嘿嘿,下面看看商业利益的推动作用,对文件 的存储形式产生了什么变化吧。
岁以上的朋友,我估计以前都使用过以下几个著名的软件:"#$"(独霸
% 下的英文编辑软件),&(裘伯君写的中文编辑软件,据说当年的市场占有
率高达 '(,各种计算机培训班的必修课程),)*+(莲花公司出品的电
子表格软件)
微软在成功地推出 后,开始垂涎桌面办公自动化软件领域。微软的
,,-开发部门,各小组分别独立地开发了 .%和 /等软件,并采用
“自定义结构”方式,对文件进行存储。在激烈的市场竞争下,为了打败竞争对手,微
软自然地产生了一个念头++++++如果我能在 .%程序中嵌入 /,那么用户
在购买了我 .%软件的情况下,不就没有必要再买 )*+了吗?!“恶
毒”(中国微软的同志们看到了这个词,不要激动,我是加了引号的呀)的计划产生
后,他们开始了实施工作,这就是 的前身 的起源(注 )。但立刻就遇
到了一个严重的技术问题:需要把 .%产生的 %文件和 /产生的
/文件保存在一起。
方案 优点 缺点
建立一个子目录,把
%、/存储在这同一
个子目录中。
数据隔离性好,.%
不用了解 /的存储
结构;容易扩展。
结构太松散,容易造成数据的
损坏或丢失。
不易携带。
修改文件存储结构,在
% 结构基础上扩展出包
容 /的结构。
结构紧密,容易携带和统
一管理。
.%的开发人员需要通晓
/的存储格式;缺少扩
展性,总不能新加一个类型就
扩展一下结构吧?!
以上两个方案,都有严重的缺陷,怎么解决那?如果能有一个新方案,能够合并前
两个方案的优点,消灭缺点,该多好呀微软是作磁盘操作系统起家的,于是很
自然地他们提出了一个非常完美的设计方案,那就是把磁盘文件的管理方式移植到
文件中了++++++复合文件,俗称“文件中的文件系统”。连微软当年都没有想到,就这
么一个简单的想法,居然最后就演变出了 组件程序设计的方法。可以说,复
合文件是 的基石。下图是磁盘文件组织方式与复合文件组织方式的类比图:
图一、左侧表示一个磁盘下的文件组织方式,右侧表示一个复合文件内部的数据组
织方式。
三、复合文件的特点
复合文件的内部是使用指针构造的一棵树进行管理的。编写程序的时候要注
意,由于使用的是单向指针,因此当做定位操作的时候,向后定位比向前定
位要快;
复合文件中的“流对象”,是真正保存数据的空间。它的存储单位为 字节。
也就是说,即使你在流中只保存了一个字节的数据,它也要占据 字节的
文件空间。啊,这也太浪费了呀?不浪费!因为文件保存在磁盘上,即
使一个字节也还要占用一个“簇”的空间那;
不同的进程,或同一个进程的不同线程可以同时访问一个复合文件的不同部
分而互不干扰;
0 大家都有这样的体会,当需要往一个文件中插入一个字节的话,需要对整个
文件进行操作,非常烦琐并且效率低下。而复合文件则提供了非常方便的“增
量访问”能力;
当频繁地删除文件,复制文件后,磁盘空间会变的很零碎,需要使用磁盘整
理工具进行重新整合。和磁盘管理非常相似,复合文件也会产生这个问题,
在适当的时候也需要整理,但比较简单,只要调用一个函数就可以完成了。
四、浏览复合文件
1附带了一个工具软件“复合文件浏览器”,文件名是“23 目录4 4
)54%,6676。为了方便使用该程序,可以把它加到工具8#59菜单中。
方法是:)54:# ;64)5 卡片中增加新的项目。运行 %,6676,
就可以打开一个复合文件进行观察了(注 0)。但奇怪的是,在 3"<#:$5
#:=)中,我反而找不到这个工具程序了汗!不过这恰好提供给大家
一个练习的机会,在你阅读完本篇文章并掌握了编程方法后,自己写一个“复合文件
浏览编辑器”程序,又练手了,还有实用的价值。
五、复合文件函数
复合文件的函数和磁盘目录文件的操作非常类似。所有这些函数,被分为 种
类型:-=&-全局函数,存储 -#"$>6接口函数,流 -#"6$ 接口函数。什
么是接口?什么是接口函数?以后的文章中再陆续介绍,这里大家只要把“接口”看成
是完成一组相关操作功能的函数集合就可以了。
WIN API 函数 功能说明
#>"6$#6%3? 5689
建立一个复合文件,得到根存储对象
#>!6#"$>689
打开一个复合文件,得到根存储对象
#>-#"$>6,5689
判断一个文件是否是复合文件
IStorage 函数 功能说明
"6$#6#"$>689
在当前存储中建立新存储,得到子存储对象
"6$#6#"6$ 89
在当前存储中建立新流,得到流对象
!6#"$>689
打开子存储,得到子存储对象
!6#"6$ 89
打开流,得到流对象
!@)89
复制存储下的所有对象到目标存储中,该函数可以实现
“整理文件,释放碎片空间”的功能
2656 6#)89
移动对象到目标存储中
%6#"@56 6#89
删除对象
.6$ 656 6#89
重命名对象
: 56 6#89
枚举当前存储中所有的对象
6#56 6#) 689
修改对象的时间
6#5$89
在当前存储中建立一个特殊的流对象,用来保存
-%(注 )
#$#89
取得当前存储中的系统信息
.656$689
关闭存储对象
IStream 函数 功能说明
.6$89
从流中读取数据
"#689
向流中写入数据
66A89
定位读写位置
6#;689
设置流尺寸。如果预先知道大小,那么先调用这个函
数,可以提高性能
!@)89
复制流数据到另一个流对象中
#$#89
取得当前流中的系统信息
5689
克隆一个流对象,方便程序中的不同模块操作同一个流
对象
.656$689
关闭流对象
WIN API 补充函数 功能说明
"#65$#>89
写 -% 到存储中,同 -#"$>6BB6#5$89
.6$5$#>89
读出 "#65$#>89写入的 -%,相当于简化调
用 -#"$>6BB#$#89
"#65$# 89
写 -% 到流的开始位置
.6$5$# 89
读出 "#65$# 89写入的 -%
"#6, #*6")@!6#>8
9
写入用户指定的剪贴板格式和名称到存储中
.6$, #*6")@!6#>89
读出 "#6, #*6")@!6#>89写入的信息。方便应
用程序快速判断是否是它需要的格式数据。
"6$#6#"6$ CD5
$589
内存句柄 CD转换为流对象
D6#CD5$5," #"6$
89
取得 "6$#6#"6$ CD5$589 调用中使用的内存
句柄
为了让大家快速地浏览和掌握基本方法,上面所列表的函数并不是全部,我省略了
“事务”函数和未实现函数部分。更全面的介绍,请阅读 %=。
下面程序片段,演示了一些基本函数功能和调用方法。
示例一:建立一个复合文件,并在其下建立一个子存储,在该子存储中再建立一个
流,写入数据。
void SampleCreateDoc()
{
::CoInitialize(NULL); // COM 初始化
// 如果是 MFC 程序,可以使用
AfxOleInit()替代
HRESULT hr; // 函数执行返回值
IStorage *pStg = NULL; // 根存储接口指针
IStorage *pSub = NULL; // 子存储接口指针
IStream *pStm = NULL; // 流接口指针
hr = ::StgCreateDocfile( // 建立复合文件
L"c:\\a.stg", // 文件名称
剩余63页未读,继续阅读
资源评论
- qshnet19702013-01-14行文幽默,可能是水平差,不怎么读的懂
- gaochao32014-09-22很好用的资源,多谢楼主分享
asdfgh4321
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于CarNet实现裂缝检测python源码+文档说明+数据+图片(课程设计)
- 课程设计-基于耐火材料裂缝剥落检测python源码+课件
- 基于OpenCV的视频道路车道检测python源码+文档说明+实验演示+图片+使用方法(高分毕业设计)
- 基于OpenCV的案例:图像边缘、角点和轮廓检测,图像分割,图像增强;图片拼接;运动目标检测,颜色直方图比较,三帧帧差法,抠图
- SmartPlug-html大一笔记
- SmartPlug-proteusdemo
- Preliminary Findings on Handmade Rattan Baby Crib andBassinet Designs Regarding.zip
- aveebfq_v1.2.83_downyi.com.apk
- 基于有机发光二极管(OLED)的建模优化算法的matlab仿真源码+数据+文档说明+项目说明(高分课程设计)
- hash01-test.c 本人哈希表(一)的示例代码,仅供参考!
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功