COM技术纵横之谈(初学者)
2008-03-26 22:45
148 查看
[align=left][/align]
C O M 技术纵横谈 一(转载) 一:概述 PC机自从诞生以来,硬件经历了无数变化,CPU从最初的INTEL 8086到 现在PIII满大街都是也只不过十几年。微软的WINDOWS操作系统从最初的 1.0版本到现在即将推出WIN2000,一直是桌面系统上装机量最大的OS。 作为软件开发人员,使用着包括Visual Basic,Visual C++,Delphi包 括最新的Borland C++ builder等等在内的众多开发环境为WINDOWS开发 应用程序。应该说现在的开发条件和若干年以前比已经是大大的进步了。 如果你开发过16位的WINDOWS程序,你可能知道为了读取一个文件,我 们不得不使用一小段汇编来调用DOS例程,或者使用当时WINDOWS尚未公开 的函数:_lopen()。在win32环境下,你所要做的全部是调用 : :CreateFile()来获得一个文件句柄,当然如果使用MFC或是OWL之类的 东西,你可以更简单的做到。不过一般情况下,程序员仍然不得不从头 开始写编写应用程序的每一行代码。 但这种情况得到了改变:微软提出了C O M(Component Object Model, 中文也可以译作"组件对象模型")概念,并且在最新的WINDOWS95/98以 及WIN NT4中越来越广泛的使用它:我们有理由相信在不久的将来,C O M 将成为构建应用程序最普遍的方法,如果你对此技术有兴趣,不妨参考本 文,希望从中你能学到想知道的知识。如果你已经是C O M老手,也欢迎 你批评指正 本文是针对C++程序员写的。在介绍概念的时候,我尽量不把WIN32 API 的知识混合进来,以便你能够更清晰的看到C O M的本质。所有的例子都 用Microsoft Visual C++5(SP3)编译通过。 一般的讲,一个应用程序总是由单个的二进制文件组成。在以前,如果 这个程序需要做一些改进,就要修改源代码,然后编译,声称新的文件, 然后取代原来的文件。现在,我们用一种全新的角度来看问题:把原先一 整个的EXE可执行文件,分割成功能不同,但相对独立的几个部分,把他 们拼装起来,组成程序,组成软件。在未来程序发布以后,如果意识到需 要对他进行修改,只要替换有问题的或是需要升级的组建就可以了。甚至 可以做到再不影响程序正常运行的情况下替换其中的部件。如果你熟悉 WINDOWS编程,可能会想到:DLL似乎就是你所说的东西:可以动态下,动 态连接。事实上,COM正是充分利用了Win32 DLL的灵活性才得以真正在 Windows平台上实现的。 这样做有哪些优点呢?首先:用户一般希望能够定制所用的应用程序, 而组件技术从本质上讲就是可被定制的,因而用户可以用更能满足他们需 要的某个组件来替换原来的那个。其次,由于组件是相对应用程序独立的 部件,我们可以在不同的程序中使用同一个组件而不会产生任何问题,软 件的可重用性将大大的得到增强。第三,随着网络带宽及其重要性的提高, 分布式网络应用程序毫无疑问的成为软件市场上越来越重要的买点。组件 价构可以使得开发这类应用程序的过程得以简化。 那么,COM到底是什么呢?它是一个说明如何建立可动态互变组件的规范。 他定义了一些为保证能互操作,客户(一个术语,指需要某种组件的程序) 组件必须遵循的标准,COM规范就是一套为组件架构设置标准的文档形 式的规范。COM的发布形式是:以win32动态链接库(DLL)或者可执行文件 (EXE)的形式发布的可执行代码组成。 COM组件是动态连接的,而且COM组件是完全与语言无关的。同时,COM组 件可以以二进制的形式发布。COM组件还可以在不妨碍老客户的情况下被升 级成新的版本。 你现在可以认为,COM所能提供的服务有些类似C++中的类。不过类是基 于源代码的,COM则不是。不过这里要澄清一些关于COM的错误观点:首先, COM不是一种计算机语言。把COM同某种计算机语言(如C++, VB)相比较是 没有意义的。其次,也不要把DLL和COM做比较,因为COM技术正是利用了 DLL的动态链接能力才得以实现的,而现在一般观点则认为,利用DLL动态 链接能力最佳的方法是COM。 当然,COM也不是win32 API那样的一个函数集:它并没有支持或者提供类 似MoveWindow这样的函数来对系统进行特定的操作。COM也并不是类似于MFC 那样的C++类库。COM给开发人员提供的是一种开发与语言无关的组件库的 方法,但COM本身并没有提供任何实现。在一定程度上可以认为COM是系统 无关的,software AG组织正在开发一系列COM支持系统,有望在不久的将 来,包括从Mac OS,VMS,SCO UNIX到LINUX的操作系统上都将得以实现COM。 COM的确有一些具体的实现。COM本身要实现一个称为COM库(COM library) 的API,它提供诸如客户对组件的查询,以及组件的注册/反注册等一系列 服务,一般来说,COM库由操作系统加以实现,程序员不必关心其实现的细 节。 总体来看,COM提供了编写组件的一个标准方法。遵循COM标准的组件可 以被组合起来以形成应用程序。至于这些组件是谁编写的,是如何实现的 并不重要。组件和客户之间通过"接口"来发生联系。 二:什么是接口 前面已经提到过,COM组件与客户大家打交道的唯一办法是通过接口。在 C++的实现中,我们一般用抽象基类来定义接口,然后利用C++类的多重继 承实现该组件。下面给出一个简单的示意: //////////////// // iface.h //////////////// #ifndef IFACE_H #define IFACE_H 1 #define interface class interface IA { public: virtual func1() = 0; virtual func2() = 0; }; interface IB { public: virtual func3() = 0; virtual func4() = 0; }; #endif //////--iface.h end--////// //////////////// // test.c //////////////// #include "iface.h" class Ca : public IA, IB { public: Ca(int i) : m_Count(i) {} virtual func1() { cout << "IA::func1 is " << m_Count * 1 << endl; } virtual func2() { cout << "IA::func2 is " << m_Count * 2 << endl; } virtual func3() { cout << "IB::func3 is " << m_Count * 3 << endl; } virtual func4() { cout << "IB::func4 is " << m_Count * 4 << endl; } int m_Count; }; main() { IA* pIa; IB* pIb; Ca* pCa = new Ca(2); pIa = pCa; pIa -> func1(); pIa -> func2(); pIb -> func3(); pIb -> func4(); delete pCa; } //////--test.c end--////// 上例中,定义了IA,IB两个接口,你可以注意到他们所有的成员函数都 被声明为virtual,并且在函数末尾用 = 0 做了结束。类似这样的函数 我们在C++中称之为纯虚函数,如果整个的类都由纯虚函数组成,那么 这个类就叫做抽象基类。抽象基类本身由于没有实体函数与变量,所以 并不分配内存。一般它的用途是为派生类指定内存结构。打个比方来说, 就好像把房子分割成很多小间,规定以后哪些小间应该放什么(函数的 实体)但具体的东西则要等派生类来填放。 这里有一个概念需要说明一下:组件并不是类,上面我们用一个类就实 现了两组接口,同样我们也可以用它来实现更多接口。组件本身其实只 是一个接口集及其实现的集合。一个组件可能包含了多个接口,每一个 接口都有各自的实现。 |
相关文章推荐
- 新皮肤,新生活
- 一个经试用效果非常不错的数据库连接池
- C/C++ 常见误区
- JVM 调优 技巧 总结
- 在个人机器(XP系统)上安装Oracle后本地能访问,而其他机器不能访问的问题
- JS打印问题
- 点石互动--石头之:SEO是狗屎还是科学?
- 摩托罗拉的品牌会留给谁?
- 从许霖案和soff案中发现的有趣问题
- 加入了一个新的项目组,感觉比较迷茫
- Blowfish算法
- 点石互动--石头之:张家界国际旅游网点评
- 关于有table control的屏幕里做BDC
- ASPNETMVC
- 写在暴风雨后的夜晚
- 《Programming WPF》翻译 第8章 动画
- C/C++字符串处理(3):String ADT - 字符串只是抽象数据类型
- C/C++字符串处理(3):String ADT - 字符串只是抽象数据类型
- 利用RequestDispatcher实现文件下载
- VC中添加串口控件 添加timer