COM原理
+ -

COM进程模型及可用性特性

2022-02-07 52 0

COM进程模型

COM有两种进程模型:进程内对象和进程外对象。
如果是进程内对象,则它在客户进程空间上运行;如果是进程外对象,则它运行在本机上的另一个进程空间或远程机上。

  • 进程内服务器:服务程序被加载到客户的进程空间,在Win32环境下,通常服务程序代码以动态连接库(DLL)的形式实现;
  • 本地服务器:服务程序与客户程序运行在同一台机器上,服务程序是一个独立的应用程序,通常它是一个EXE文件;
  • 远程服务器:服务程序运行在与客户不同的机器上,既可以是一个DLL模块,也可以是一个EXE文件。如果远程服务程序以DLL形式实现,远程机上会创建一个代理进程。

虽然COM对象有不同的进程模型,但这种区别对客户来说是透明的,因此客户程序在使用组件对象时可不管这种区别的存在,只要遵照COM规范即可。然而,在实现COM对象时,还是应慎重选择进程模型。

  • 进程内模型的优点是效率高,但组件不稳定会引起客户进程崩溃,因此组件可能会危及客户(注:如果组件不稳定,进程外模型同样也会出问题,但进程内组件和客户同处一个地址空间,出现冲突的可能性较大);
  • 进程外模型的优点是稳定性好,组件进程不会危及客户程序,一个组件进程可以为多个客户进程提供服务,但进程外组件开销大,且调用效率相对低一点。

COM特性(可重用性)

由于COM标准是建立在二进制代码级的,因此COM对象的可重用性与一般的面向对象语言如C++对象的重用过程不同。对COM对象的客户程序来说,它只是通过接口使用对象提供的服务,它并不知道对象内部的实现过程,因此,组件对象的重用性可建立在组件对象的行为方式上,而不是具体实现上,这是建立重用的关键。

COM用两种机制实现对象的重用。假定有两个COM对象,对象1希望能重用对象2的功能,对象1被称为外部对象,对象2称为内部对象。

  • (1)包容方式。对象1包含了对象2,当对象1需要用到对象2的功能时,可简单地把实现交给对象2来完成,虽然对象1和对象2支持同样的接口,但对象1在实现接口时实际上调用了对象2的实现。
  • (2)聚合方式。对象1只需简单地把对象2的接口递交给客户即可,对象1并没有实现对象2的接口,但它把对象2的接口也暴露给客户程序,而客户程序并不知道内部对象2的存在。

在组件对象被聚合的情况下,当客户请求它所不支持的接口或请求IUnknown接口时,它必须把控制交给外部对象,由外部对象决定客户程序的请求结果。聚合模型体现了组件软件真正意义上的重用。
聚合模型实现的关键在CoCreateInstance函数和IClassFactory接口。其中pUnknownOuter参数用于指定组件对象是否被聚合,是外部组件对象的接口指针。如果pUnknownOuter=NULL,说明组件对象正常使用,否则说明被聚合使用。

聚合模型下的被聚合对象的引用计数成员函数也要进行特别处理。在未被聚合的情况下,可使用一般的引用计数方法。在被聚合时,由客户调用AddRef/Release时,必须转向外部组件对象的AddRef/Release方法。这时,外部组件对象要控制被聚合的对象必须采用其它的引用计数接口。

0 篇笔记 写笔记

COM进程模型及可用性特性
COM进程模型COM有两种进程模型:进程内对象和进程外对象。如果是进程内对象,则它在客户进程空间上运行;如果是进程外对象,则它运行在本机上的另一个进程空间或远程机上。进程内服务器:服务程序被加载到客户的进程空间,在Win32环境下,通常服务程序代码以动态连接库(DLL)的形式实现;本地服务器:服......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!