COM/DCOM综述

1. 分布式组件对象模型
  多少年来软件的开发过程并没有很大的改变,软件开发过程中需要面对的主要问题如:开发周期长,难于确保程序的正确性,难于维护等还没有得到非常好的解决,尽管出现了如面向对象,框架设计等等的概念和工具。组件对象模型是传统面向对象模型的扩充,传统面向对象模型的重点是源程序,以及系统分析和设计过程。组件的概念则强调大的软件系统如何由不同开发商的小型可执行组件构成。以下首先从面向对象模型开始对各种概念作一番梳理。
  · 面向对象编程
  面向对象是一个被广大编程人员和工业界认同已久的概念。面向对象程序设计语言让开发者按照现实世界里人们思考问题的模式来编写程序,它让开发者更好地用代码直接表达现实中存在的对象,这样开发代码简单并且易于维护。面向对象语言有以下三个最重要的概念:
  封装(Encapsulation)- 强调隐藏对象的实现细节,对象的使用者仅仅通过定义好的接口使用对象。
  继承(Inheritance)- 新的对象可以利用旧的对象的功能。
  多态(Polymorphism)- 根据所使用的对象展现多种不同行为的能力。
  而从程序的整体来看,面向对象编程提供给用户的最重要的概念则是代码的共享与重用,它对于提高编写程序的效率极为重要。但是代码的共享与重用一旦应用于实践中仍然存在种种问题,如版本的升级、接口的变化、在不同程序设计语言之间共享代码等等。对于这些困难原有的面向对象程序设计方法并没有相应的答案,这就是组件对象模型提出的背景。
  · 组件对象模型
  将工程分解为逻辑组件是面向组件分析和设计的基础,这也是组件软件的基础。组件软件系统由可重用的二进制形式的软件组件模块组成,只需要相当小的改动就可以将这些来自不同开发商的组件模块组合在一起。特别重要的是这样的组合并不需要源代码,也不需要重新编译,组件之间通过基于二进制的规范进行通讯,这被称为二进制重用。组件模块是独立于编程语言的,使用组件的客户程序和组件之间除了通过标准的方法进行通讯以外,彼此不做任何限定。
  组件可以划分为不同的类型,包括可视化组件如按钮或者列表框;功能组件如打印或者拼写检查。例如一个基于组件的架构可以提供将多个开发商的拼写检查组件插入到另一个开发商的字处理应用程序中的机制,这样用户可以根据自己的喜好方便地选择和替换字处理软件。
  组件结构中最重要的概念是接口。接口是集合在同一个名称(通常是一个系统唯一的ID值)下的相关方法的的集合。组件之间的通讯是基于接口的,接口是组件和其客户之间严格类型化的契约。实现相同接口的两个对象就被认为是多态的,这里的多态不包含诸如基类指针指向派生类对象的意义,这里是指同一个接口可以由多个对象以不同方法实现。

  2. COM/DCOM的基本概念
  · 概述
  以下将通过程序实例解释COM/DCOM的基本概念。基于微软的一贯作风,虽然COM/DCOM自称为是一个可跨平台支持异构的模型(也确实从根本上说是可以跨平台的),但它也是和Microsoft Windows系统中的其它概念紧密结合在一起的,而且除了Microsoft Windows系统以外很少有什么系统支持COM/DCOM,所以在以下概念的介绍中将基于Microsoft Windows系统。COM/DCOM模型主要包括三方面的内容:(A)程序编写的模式。(B)程序交互时遵循的二进制规范。(C)程序运行的辅助环境。首先通过图1描述COM/DCOM基本机制。
       
  由图可见COM/DCOM是基于客户机和服务器模型的,客户程序和组件程序是相对的,进行功能请求调用的是客户程序而响应该请求的是组件程序。组件程序也可以作为客户程序去调用其它的组件程序,正是这种角色的转换和相互调用关系使组件程序最终构成一个软件系统。根据COM/DCOM中客户程序和组件程序的交互关系可以将组件分为进程内组件和进程外组件两种。所谓进程内组件是指客户程序和组件程序在同一个进程地址空间内;进程外组件指客户程序和组件程序分别处在不同的进程空间地址中。进程内组件是通过将组件作为动态连接库(DLL)来实现的,客户程序将组件程序加载到自己的进程地址空间后再调用组件程序的函数。对于这两种不同的组件,客户程序和组件程序交互的内在方式是完全不同的。但是对于功能相同的进程内和进程外组件,从程序编写的角度看,客户程序是以同样的方法来使用组件程序的,客户程序不需要做任何的修改。因此以下先通过进程内组件的实现来理解COM/DCOM的编程模式。
  · 进程内组件:
  例子程序
  以下是一个用C++语言编写的COM程序实例的主要内容:
  头文件:component.h
  interface DECLSPEC_UUID("10000001-0000-0000-0000-000000000001")
  ISum : public IUnknown
  {public:
    virtual HRESULT STDMETHODCALLTYPE Sum( int x, int y, int __RPC_FAR *retval) = 0;
  };
  客户程序:
  #include "component.h"
  const CLSID CLSID_InsideCOM = {0x10000002,0x0000,0x0000,
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}};
  void main()
  {
    IUnknown* pUnknown;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值