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影响就越小

时间: 2025-01-18 12:27:51