用VC进行COM编程所必须掌握的理论知识[ZZ]

这篇文章是给初学者看的,尽量写得比较通俗易懂,并且尽量避免编程细节。完全是根据我自己的学习体会写的,其中若有技术上的错误之处,请大家多多指正。

  一、为什么要用COM

  软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的。结构化编程是函数块的形式,通过把一个软件划分成许多模块,每个模块完成各自不同的功能,尽量做到高内聚低藕合,这已经是一个很好的开始,我们可以把不同的模块分给不同的人去做,然后合到一块,这已经有了组装的概念了。软件工程的核心就是要模块化,最理想的情况就是100%内聚0%藕合。整个软件的发展也都是朝着这个方向走的。结构化编程方式只是一个开始。下一步就出现了面向对象编程,它相对于面向功能的结构化方式是一个巨大的进步。我们知道整个自然界都是由各种各样不同的事物组成的,事物之间存在着复杂的千丝万缕的关系,而正是靠着事物之间的联系、交互作用,我们的世界才是有生命力的才是活动的。我们可以认为在自然界中事物做为一个概念,它是稳定的不变的,而事物之间的联系是多变的、运动的。事物应该是这个世界的本质所在。面向对象的着眼点就是事物,就是这种稳定的概念。每个事物都有其固有的属性,都有其固有的行为,这些都是事物本身所固有的东西,而面向对象的方法就是描述出这种稳定的东西。而面向功能的模块化方法它的着眼点是事物之间的联系,它眼中看不到事物的概念它只注重功能,我们平常在划分模块的时侯有没有想过这个函数与哪些对象有关呢?很少有人这么想,一个函数它实现一种功能,这个功能必定与某些事物想联系,我们没有去掌握事物本身而只考虑事物之间是怎么相互作用而完成一个功能的。说白了,这叫本末倒置,也叫急功近利,因为不是我们智慧不够,只是因为我们没有多想一步。面向功能的结构化方法因为它注意的只是事物之间的联系,而联系是多变的,事物本身可能不会发生大的变化,而联系则是很有可能发生改变的,联系一变,那就是另一个世界了,那就是另一种功能了。如果我们用面向对象的方法,我们就可以以不变应万变,只要事先把事物用类描述好,我们要改变的只是把这些类联系起来的方法,只是重新使用我们的类库,而面向过程的方法因为它构造的是一个不稳定的世界,所以一点小小的变化也可能导致整个系统都要改变。然而面向对象方法仍然有问题,问题在于重用的方法。搭积木式的软件构造方法的基础是有许许多多各种各样的可重用的部件、模块。我们首先想到的是类库,因为我们用面向对象的方法产生的直接结果就是许多的类。但类库的重用是基于源码的方式,这是它的重大缺陷。首先它限制了编程语言,你的类库总是用一种语言写的吧,那你就不能拿到别的语言里用了。其次你每次都必须重新编译,只有编译了才能与你自己的代码结合在一起生成可执行文件。在开发时这倒没什么,关键在于开发完成后,你的EXE都已经生成好了,如果这时侯你的类库提供厂商告诉你他们又做好了一个新的类库,功能更强大速度更快,而你为之心动又想把这新版的类库用到你自己的程序中,那你就必须重新编译、重新调试!这离我们理想的积木式软件构造方法还有一定差距,在我们的设想里希望把一个模块拿出来再换一个新的模块是非常方便的事,可是现在不但要重新编译,还要冒着很大的风险,因为你可能要重新改变你自己的代码。另一种重用方式很自然地就想到了是DLL的方式。Windows里到处是DLL,它是Windows 的基础,但DLL也有它自己的缺点。总结一下它至少有四点不足。(1)函数重名问题。DLL里是一个一个的函数,我们通过函数名来调用函数,那如果两个DLL里有重名的函数怎么办?(2)各编译器对C++函数的名称修饰不兼容问题。对于C++函数,编译器要根据函数的参数信息为它生成修饰名,DLL库里存的就是这个修饰名,但是不同的编译器产生修饰的方法不一样,所以你在VC 里编写的DLL在BC里就可以用不了。不过也可以用extern "C";来强调使用标准的C函数特性,关闭修饰功能,但这样也丧失了C++的重载多态性功能。(3)路径问题。放在自己的目录下面,别人的程序就找不到,放在系统目录下,就可能有重名的问题。而真正的组件应该可以放在任何地方甚至可以不在本机,用户根本不需考虑这个问题。(4)DLL与EXE的依赖问题。我们一般都是用隐式连接的方式,就是编程的时侯指明用什么DLL,这种方式很简单,它在编译时就把EXE与DLL绑在一起了。如果DLL发行了一个新版本,我们很有必要重新链接一次,因为DLL里面函数的地址可能已经发生了改变。DLL的缺点就是COM的优点。首先我们要先把握住一点,COM和DLL一样都是基于二进制的代码重用,所以它不存在类库重用时的问题。另一个关键点是,COM本身也是DLL,既使是ActiveX控件.ocx它实际上也是DLL,所以说DLL在还是有重用上有很大的优势,只不过我们通过制订复杂的COM协议,通COM本身的机制改变了重用的方法,以一种新的方法来利用DL

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
第2章 控件应用 75 2.1 按钮控件典型实例 76 实例049 AVI动画按钮 76 实例050 GIF动画按钮 78 实例051 图文按钮 80 实例052 不规则按钮 82 实例053 热点按钮 84 2.2 编辑框控件典型实例 86 实例054 为编辑框设置新的系统菜单 87 实例055 为编辑框控件添加列表选择框 88 实例056 多彩边框的编辑框 90 实例057 改变编辑框文本颜色 91 实例058 不同文本颜色的编辑框 92 实例059 位图背景编辑框 93 2.3 静态文本控件典型实例 94 实例060 电子计时器 94 实例061 使用静态文本控件设计群组框 96 实例062 制作超链接控件 97 2.4 列表框控件典型实例 99 实例063 利用列表框控件实现标签式数据选择 99 实例064 具有水平滚动条的列表框控件 100 实例065 列表项的提示条 101 实例066 位图背景列表框控件 104 2.5 组合框控件典型实例 105 实例067 将数据表中的字段添加到组合框控件 106 实例068 带查询功能的组合框控件 107 实例069 自动调整组合框的宽度 108 实例070 颜色组合框 109 实例071 多列显示的组合框 111 实例072 带图标的组合框 113 实例073 显示系统盘符组合框 114 2.6 列表视图控件典型实例 115 实例074 Windows资源管理器 115 实例075 利用列表视图控件浏览数据 118 实例076 利用列表视图控件制作导航界面 120 实例077 在列表视图中拖动视图项 121 实例078 具有排序功能的列表视图控件 123 实例079 具有文本录入功能的列表视图控件 126 实例080 使用列表视图设计登录界面 128 2.7 树视图控件典型实例 129 实例081 多级数据库树状结构数据显示 129 实例082 节点拖动功能的树控件 131 实例083 带复选功能的树状结构 134 实例084 三态效果树控件 135 实例085 修改树控件节点连线颜色 137 实例086 位图背景树控件 138 实例087 显示磁盘目录 140 实例088 树型提示框 141 2.8 RichEdit控件典型实例 143 实例089 利用RichEdit显示Word文档 143 实例090 利用RichEdit控件实现文字定位与标识 144 实例091 利用RichEdit控件显示图文数据 146 实例092 在RichEdit中显示不同字体和颜色的文本 148 实例093 在RichEdit中显示GIF动画 149 2.9 滚动条控件典型实例 157 实例094 自定义滚动条控件 157 2.10 进度条控件典型实例 162 实例095 进度条百分比显示 162 实例096 渐变颜色的进度条 164 2.11 工具提示控件典型实例 165 实例097 应用工具提示控件 165 2.12 滑块控件典型实例 167 实例098 使用滑块控件设置颜色值 167 实例099 绘制滑块控件 168 2.13 标签控件典型实例 170 实例100 应用标签控件 170 实例101 自定义标签控件 172 2.14 控件数组典型实例 175 实例102 向窗体中动态添加控件 175 实例103 公交线路模拟 177

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值