设为首页 加入收藏

TOP

全面理解COM+(三)
2012-11-04 15:13:16 来源: 作者: 【 】 浏览:1113
Tags:全面 理解 COM
  3.对象环境

  COM+组件的可管理性和可配置性是如何获得的呢?如同MTS组件一样,COM+为每一个对象提供了一个对象环境(Object Context),COM+系统可以在创建COM+对象的时候为其分配一个环境对象,这种技术也被称为截取(intercept),下面的步骤可以进一步说明截取的概念:

  (1) 组件对象通过说明性属性(declarative attributes)指定它的一些基本要求;

  (2) 当客户程序调用CoCreateInstance函数时,COM+系统检查客户代码是否运行在与对象类兼容的对象环境中;

  (3)如果客户代码的运行环境与对象类所要求的兼容,那么不必使用截取技术,直接创建对象并返回对象的接口引用;

  (4) 如果不兼容,那么CoCreateInstance函数切换到一个与对象类兼容的环境中,然后创建对象并返回一个代理对象;

  (5)在以后的接口方法调用过程中,代理对象在调用前和调用后都要做一些处理以便方法的运行环境能够满足对象的要求。

  COM+引入了环境(context)的概念,它是指共享同一套运行要求的对象集合。由于不同的对象类可能使用了不同的配置信息,所以一个进程通常包含一个或多个环境,这些环境的配置互不兼容。所有无配置信息的对象都驻留在调用方的环境中。每一个环境都有一个对象,即对象环境,运行在此环境中的对象可通过CoGetObjectContext API函数得到此对象环境,利用对象环境的IObjectContextInfo接口可以访问到环境的属性信息。

  COM+的对象引用即客户拥有的对象接口指针与环境相关,所以我们不能简单地把对象引用从一个环境传递到另一个环境。当客户从一个环境调用到另一个环境中的对象时,中间必须经过代理对象和存根代码,由代理对象截取调用,负责进行环境切换,这个过程类似于COM的跨进程列集(marshaling)处理。如图5所示。


图5 跨环境调用示意图

  从图5我们可以看出,环境与COM线程模型中的套间(apartment)非常类似,当对象引用(即对象接口指针)从一个环境传递到另一个环境时,它也要经过列集(marshaling)处理,即调用CoMarshalInterface和CoUnmarshalInterface函数。这样才能保证客户代码和对象分别在自己的环境中执行,对于支持事务特性、安全特性或其他特殊要求的应用,这是很重要的。

  虽然跨环境的调用必须经过代理和存根代码,但是这并不意味着需要经过线程切换,这是环境与套间的重要区别。在跨套间调用过程中,影响性能的主要因素在于线程切换,而不是参数列集(marshaling)和散集(unmarshaling)处理,因此跨环境调用比跨套间调用的效率可能要高得多。COM+引入了环境概念,但套间的概念仍然存在,两者的区别在于,套间是线程模型的基本单元,而环境则是列集机制的基本边界。环境和套间没有包含关系,一个环境中的对象可以运行在不同的套间,此时跨套间调用也必须经过代理对象;一个套间中的对象也可以包含多个环境对象,此时跨环境调用也必须经过代理对象。

  从以上对COM+的介绍我们可以看出,COM+的底层结构仍然以COM为基础,但在应用方式上则更多地继承了MTS的处理机制,包括MTS的对象环境、安全模型、配置管理等。但COM+并不是对COM和MTS进行简单的封装,它也引入了许多新的内容,正是这些新特征使得COM+更加适合于企业应用的组件对象模型,这些新特征通过一组系统服务来体现,下一部分介绍这些系统服务。

首页 上一页 1 2 3 4 5 6 下一页 尾页 3/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇COM+ 管理:了解组件服务管理工具 下一篇VC设计多功能标签CLabelEx

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: