在刚开始工作那会儿,就听说COM(组件对象模型)。两年后还是不清楚COM到底是一个什么东西?下定决心要搞懂COM,特地还买了一下相关的书籍。可总感觉不清不楚的。最近在网上看到了一个帖子,感觉似乎有点那个味道。就总结了一下。

 

几点感悟:

  • COM是一种编程方法,有点类似于OO.在你的编程中可是使用OO原则来编写代码,同样也可使用COM原则来编写代码。COM是一种编写软件的方法。
  • 组件是一些小的二进制程序,他们可以给其他的应用程序或者操作系统或者其他的组件提供服务。开发自定义的组件,就有点类似于开发动态的,面向对象的API。
  • COM并不是一个大的API,它实际上像结构化编程及面向对象编程方法那样,也是一种编程方法。在任何一种操作系统中,开发人员均可遵循COM方法。

开发人员开始将单个的的应用程序分割成多个独立的部分,也即组件。这种做法的好处是可以随着科技的不断发展而用新的组件取代已有的组件。此时的应用程序可以随着组件不断取代旧的组件而渐趋完善。而且利用已有的组件,用户还可以快速的建立全新的应用。

传 统的做法是将应用程序分割成文件,模块或者类,然后将他们编译或者链接成一个单独应用程序。它与组件建立应用程序的过程有很大的不同。一个组件同一个微型 应用程序类似。即都是已经编译链接好的的并且可以使用的二进制代码,应用程序就是由多个这样的组件打包而得到的。单模应用程序只有一个二进制代码模块。自 定义组件可以在运行时刻同其他的组件链接起来已构成某些引用程序。在需要对应用程序进行修改或者改进时,只需要将构成此应用程序的组件中的某个用新的版本 替换掉即可。

COM(组件对象模型)是关于如何建立组件以及如何通过组件建立应用程序的一个规范,说明了如何可动态交替更新组件。

使 用组件的种种优点直接来源于可以将他们动态的插入或者卸除应用。(有点类似DLL,但DLL是为函数库而实现的,如果在DLL中放类的话,很容易进入 DLL地狱)。为了实现这个功能,所有的组件对象必须满足两个条件:第一,组件必须动态链接;第二,他们必须隐藏(或者封装)其内部实现细节。动态链接对 于组件而言是一个至关重要的要求,而消息隐藏则是动态链接的一个必要条件。

 COM组件由以Win32动态库(DLL)或者可执行文件(EXE)形式发布的可执行代码所组成。遵循COM规范编写出来的组件将能够满足对组件架构的所有要求。

 


1,什么是COM组件?

  •  COM组件是以WIN32动态链接库(DLL)或者可执行文件(EXE)形式发布的可执行代码组成。
  •  COM组件是遵循COM规范编写的
  • COM组件是一些小的二进制可执行文件
  • COM组件可以给应用程序、操作系统以及其他组件提供服务
  • 自定义的COM组件可以在运行时刻同其他组件连接起来构成某个应用程序
  • COM组件可以动态的插入或者写出应用
  • COM组建必须是动态链接的
  • COM组件必须隐藏(封装)其内部实现细节
  • COM组件必须将其实现的语言隐藏
  • COM组件必须以二进制的形式发布
  • COM组件必须在不妨碍已有用户的情况下被升级
  • COM组件可以透明的在网络上被重新分配位置
  • COM组件按照一种标准的发那个是来宣布他们的存在

 

2,组件不是..........?

  • COM组件不是一种计算机语言
  • COM组件不是DLL,只是利用DLL来给组件提供动态链接的能力
  • COM组件不是一个API函数集
  • COM组件不是类

 

3 ,什么是接口?

  • 接口就是提供两个不同对象的一种连接。
  • 计算机程序是通过一组函数而进行链接的。这组函数就是定义了程序中不同部分的接口。
  • DLL的接口就是他所输出的那些函数
  • C++类的接口就是该类的成员函数集
  • COM中的接口是一组由组件实现的提供给客户使用的函数
  • 在COM中接口是一个包含函数指针的数组的内存结构,数组元素是一个由组件实习那的函数地址。

 

4,接口的作用是什么?

  • 有了组件,如何将他们链接起来构成某个应用程序,需要用接口。
  • 在COM中接口就是一切,对客户说组件就是接口集,客户只能通过接口和组件打交道。
  • 说明接口可以保护系统免受外借变化的影响。这就是封装的体现。
  • 接口实现了使用用户使用同样的方式来处理不同的组件。这是多态的提现。

 

5,什么是IUnKnown?

IUnKnown是一个接口。

所有COM接口都继承IUnKnown.

IUnKnown的定义在WIN32 SDK中的UNKNEN头文件中

interface IUnKnow
{
  virtual HRESULT __stdcall QueryInterface(const IID&iid ,void **ppv)=0;
  virtual ULONG __stdcall AddRef()=0;
  virtual ULONG __stdcall  Release()=0;
}

 

6 ,QueryInterface函数的作用是什么?

  • QueryInterface是IUnKnown的成员函数,客户可以通过此函数来查询组件是否支持某一个特定的接口。
  • QueryInterface函数返回一个指向组件支持的接口的指针。
  • 如果QueryInterface函数没有找到组件支持的接口则返回指针是NULL
  • QueryInterface函数可以使用If then else 语句,数组,散列表,树来实现。
  • QueryInterface函数不能使用Case语句。因为QueryInterface函数返回的是一个HRESULT结构而不是一个数。
  • QueryInterface也是一种无封处理组件版本的机制。这种机制使得组件的新旧不同的版本可以互操作。

 

7 ,QueryInterface函数的实现规则是什么?

  • QueryInterface返回的IUnKnown指针总是相同的。
  • 如果客户获得某个接口,那么它总能获得此接口。
  • 客户可以再次获得已经拥有的接口
  • 客户可以返回到起始接口。
  • 若能够在某一个接口获得某一个特定接口,那么从任意接口都将可以获得此接口。

 

8 ,接口是如何实现?

  • COM接口在C++中是用纯抽象基类实现。
  • 一个COM组件可以支持多个接口
  • 一个C++类可以使用多重继承来实现一个支持多个接口的组件。
  • 组件可以支持任意数目的接口
  • 接口应该具有不变性。在组件升级时应该不修改原来的接口,而是添加新的接口。
  • 要精心设计实现接口,以使之能够支持各种不同的实现。

 

9,QueryInterface函数的参数IID是什么?

  • 他是一个结构,接口标识符结构。
  • IID标识了客户所需要的接口
  • 每一个接口都有一个唯一的接口标识符。所以某个与IID对应的接口绝对不会发生变化。
  • 接口IID决定了COM组件的版本。
  • 不同的接口具有不同的ID,包括不同版本的接口。

 

10,何时需要建立一个新的COM组件版本?

  • 当为已有接口指定新的IID时应该是下面的调价至少有一个成立。
  • 接口中函数的数目发生改变时
  • 接口中函数的顺序发生改变
  • 接口中某一个函数的参数发生改变
  • 接口中某一个函数的参数类型发生改变
  • 接口中函数的返回值发生改变
  • 接口中函数的返回值类型发生了改变。
  • 接口中函数的含义发生了改变。

 


在内存中,COM对象这种标准形式在C++虚函数中偶尔用到,所以这就是为什么许多COM组件代码使用C++的原因。但是记住,编写模块所用的语言是无关的,因为结果二进制代码为所有语言可用。

此外,COM不是Win32特有的。从理论上讲,它可以被移植到Unix或者其他操作系统,但是似乎从来没有听说过在除了Windows以为的其他地方听说过COM.

 

 

 

 

 

 

 

 



收藏
0个人 收藏

关注Joomla中国微信公众号,随时获得最新的Joomla新闻资讯!