首页 > 代码库 > com

com

COM

Component Object Model (组件对象模型)

在二进制级别上进行集成和重用的软件单元

 

在同一软件中的组件必须使用相同的接口标准,组件之间才能相互通信

 

访问COM对象的唯一途径是通过COM接口

接口是一组调用函数,也是客户程序和组件之间的协议

核心接口--IUnknown

 

COM 是C/S模型

首先创建一个COM对象,然后通过COM接口调用它所提供的服务,服务结束后记得释放资源

 

多个COM对象可以连接起来组成应用程序或组件系统,并且组件可以在运行时、不重新编译链接的情况下被替换掉

Micrpsoft也大量运用了COM来开发他们的应用程序

 

 

一个用C++实现COM的简单但完整的例子:

 1 #include "stdafx.h"
 2 #include <objbase.h>
 3 #include <iostream>
 4 
 5 using std::cout;
 6 using std::endl;
 7 
 8 void trace(const char *pMsg) {cout << pMsg << endl;}
 9 
10 interface IX { // Interface
11     virtual void __stdcall Fx1() = 0;
12     virtual void __stdcall Fx2() = 0;
13 };
14 
15 interface IY {
16     virtual void __stdcall Fy1() = 0;
17     virtual void __stdcall Fy2() = 0;
18 };
19 
20 class CA : public IX, public IY { // Component
21 public:
22     virtual void __stdcall Fx1() {cout << "CA::Fx1" << endl;}
23     virtual void __stdcall Fx2() {cout << "CA::Fx2" << endl;}
24     virtual void __stdcall Fy1() {cout << "CA::Fy1" << endl;}
25     virtual void __stdcall Fy2() {cout << "CA::Fy2" << endl;}
26 };
27 
28 int _tmain(int argc, _TCHAR* argv[]) // Client
29 {
30     trace("Client: Create an instance of the component.");
31     CA * pA = new CA;
32 
33     IX * pIX = pA;
34     trace("Client: Use the IX interface.");
35     pIX->Fx1();
36     pIX->Fx2();
37 
38     IY * pIY = pA;
39     trace("Client: Use the IY interface.");
40     pIY->Fy1();
41     pIY->Fy2();
42 
43     trace("Client: delete the component");
44     delete pA;
45     return 0;
46 }

 

 客户和组件之间应该只通过接口来通信,这样的话,就算组件发生改变,整个程序也无序重新编译。接口是通过纯虚基类来实现的。

在COM中对一个组件的访问只能通过函数,而不能通过变量。

 

client对component知道的越少,那么component的改变对client影响就越小