COM原理及应用----COM特性

1、面向对象系统的三个最基本的特性

封装性、多态性、重用性。

2、COM特性的概述

COM对象的封装特性是很彻底的,所有的对象状态信息必须通过接口才能访问;而COM的多态性完全通过接口体现出来,而且,COM分别在三个层次上体现了多态性:接口成员函数、单个接口、一组接口(对象类别即 implemented category)。而COM的重用性相对复杂。

3、重用性

所谓重用性是指,当一个程序单元能够对其他的程序单元提供功能服务时,尽可能地重用原先程序单元的代码,既可以在源代码一级重用,也可以在可执行代码一级重用。

C++语言的重用性位于源代码一级,一个类可以继承于另一个类,从而把父类的功能重用。但对于COM组件则情形有所不同,因为COM是建立在二进制代码基础上的标准,所以其重用性也必然建立于二进制代码一级。

COM重用性是指一个COM对象如何重用已有的COM对象的功能,而不是重复实现老的功能服务。按照COM的标准,实现这种重用性有两条途径:包容和聚合。

4、包容和聚合

对象B调用对象A的相应成员函数实现ISomeInterface接口。因此,对象B的ISomeInterface接口提供的功能可以超过对象A的接口功能,返回结果也可以不一致。甚至,对象B的接口与对象A的接口不一定相同。一般来说,对象A的生存期包含在对象B的生存期之内。

在聚合模型中,被聚合的对象A虽然直接向对象B的客户程序提供功能服务,但它的生存期仍受对象B控制,而且其他的一些行为也受对象B的控制,包括内部状态初始化、获取数据等等。

为了使聚合能够顺利实现,对象A必须能够适应在被聚合的情况下进行特殊的处理,尤其是接口的QueryInterface成员函数,在被聚合情况下,当客户请求它所不支持的接口或者IUknown接口时,它必须把控制交给外部对象,由外部对象决定客户程序的请求结果。

聚合涉及到聚合对象和被聚合对象双方的协作,并不是每个对象都能够支持聚合特性,但聚合体现了组件软件真正意义上的重用。而包容的重用性完全建立在客户/服务器模型相对性的基础上,实际上也就是客户程序和组件程序的嵌套关系。这是包容和聚合本质的不同。

5、委托IUnknown和非委托IUnknown

对象创建函数CoCreateInstance的第二个参数pUnknownOuter用于解决聚合中IUnknown接口的问题。当其为NULL时表示正常使用,不为NULL时被聚合使用。内部对象实现两个IUnknown 分别用于这两种情况:委托IUnknown和非委托IUnknown(delegating unknown和nondelgating unknown)。

按照通常使用方式实现的IUnknown为非委托IUnknown,而委托IUnknown在不同的情况下有不同的行为:当对象被正常使用时,委托 IUnknown把调用传递给对象的非委托IUnknown;当对象被聚合使用时,委托IUnknown把调用传递到外部对象的IUnknown接口,即对象被创建时传递进来的pUnkownOuter参数,并且,这时外部对象通过非委托IUnknown对内部对象进行控制。委托IUnknown本身不进行任何操作。

因为C++类不支持同时实现两个IUnknown,所以委托IUnknown和非委托IUnknown不能都使用IUnknown类,但我们可以定义一个新的类。因为COM不是通过类名来识别接口,而是通过vtable来调用接口成员函数。

6、COM接口调用的进程透明性

客户程序创建COM对象具有进程透明特性,不管是进程内组件还是进程外组件,客户程序可以使用一致的方法创建COM对象。对于进程内组件,无论是创建过程,还是客户程序对接口函数的调用过程,都可以按照一般的同一进程内部函数调用的过程来理解组件和客户之间的交互操作;但对于进程外组件,实际的情形要复杂得多,因为组件程序户程序拥有不同的进程空间,所以,它们之间所有的交互过程都涉及到进程之间的通信过程。然而,COM客户程序创建进程外组件程序成功后,它就得到了组件对象的一个接口指针,通过该指针间接调用组件对象的成员函数,如同调用本进程内的函数一样,这正是COM所期望达到的透明效果。

时间: 2024-09-30 14:16:31

COM原理及应用----COM特性的相关文章

Spark的RDD原理以及2.0特性的介绍(转)

Spark 是什么  Spark 是 Apache 顶级项目里面最火的大数据处理的计算引擎,它目前是负责大数据计算的工作.包括离线计算或交互式查询.数据挖掘算法.流式计算以及图计算等.全世界有许多公司和组织使用或给社区贡献代码,社区的活跃度见 www.github.com/apache/spark. 2013 年开始 Spark开发团队成立 Databricks,来对 Spark 进行运作和管理,并提供 Cloud 服务.Spark 社区基本保持一个季度一个版本,不出意外的话 Spark 2.0

【MySQL】MySQL5.6新特性之crash-safe

一 介绍  MySQL 5.6 针对复制功能提供了新特性: slave支持crash-safe. 该功能可以解决之前版本中系统异常断电可能导致的SQL thread 信息不准确的问题.本文从原理方面对该特性进行介绍.二 原理  在了解crash-safe slave 之前,我们先分析一下MySQL 5.6 之前的版本出现 crash-unsafe 的原因.在slave上,复制包含两个线程:即replication中的IO thread和SQL thread.IO thread负责从master拷

PHP代码审计片段讲解(入门代码审计、CTF必备)

代码审计对于很多安全圈的新人来说,一直是一件头疼的事情,也想跟着大牛们直接操刀审计CMS?却处处碰壁: 函数看不懂! 漏洞原理不知道! PHP特性更不知! 那还怎么愉快审计? 不如化繁为简,跟着本项目先搞懂PHP中大多敏感函数与各类特性,再逐渐增加难度,直到可以吊打各类CMS~ 本项目讲解基于多道CTF题,玩CTF的WEB狗也不要错过(^-^)V 题的源码在Github: bowu (Github),可以自行部署,也可以静态审计. 题1 extract变量覆盖 http://127.0.0.1/

ASP.NET MVC使用Ajax的辅助的解决方法_实用技巧

前言:前面我们已经简单的介绍过了MVC如何Jquery,因为我们如果使用Ajax的话必须要了解Jquery,这篇博客我们将大致了解一下ASP.NET MVC如何使用Ajax的辅助方法,此博客是我的读书笔记,如果那里写的不好,还请各位朋友提出来,我们共同学习.1.准备工作 (1)在MVC刚开始学习的时候,我们就需要介绍ASP.NET MVC框架中的HTML的辅助方法,但是这类文章现在已经很多了,而且个人感觉很简单,所以没有写笔记,我在这里就不介绍了. (2)ASP.NET MVC框架中的HTML辅

一位自学生的努力与梦想

求职历程:只面了两间,都是一轮笔试+三轮面试,拿到心仪公司offer后就木有参加其他面试了.1.淘宝(研发工程师)终面后被BS,那RP....2.腾讯(后台开发工程师)成功拿到offer. 学习经历:作为一个非计科专业的学生,三年自学血泪史历历在目.没人指导,靠自己摸搜,走过很多歪路,不被同学朋友理解,被老师当问题学生,被早学几年的前辈嘲笑.一度怀疑自己,长年处于坚持和疑虑之间. 两年前下誓言至今还一直保留在QQ个人介绍里:从今以后不再表示什么决心,用结果用事实用作品去证明自己一直在努力.为未来

APMCon2017 | 一大波技术大神来袭,你要的性能优化干货这里全都有

APMCon2017 | 一大波技术大神来袭,你要的性能优化干货这里全都有 在波涛汹涌的技术世界里,如果不希望自己的小船说翻就翻,就需要跟着大神多学学, 所谓听君一席话,胜读十年书.现在就有个跟着大神学技术的好机会 就在今年的8月10-11日,听云联合了极客邦科技 / InfoQ将共同主办国内第二届应用性能管理大会-APMCon 2017,会议内容聚焦了行业内最新的技术和最接地气的实践案例,将共同探讨APM相关的性能优化.技术方案以及创新思路,可以为更多的行业从业者指点应用效能提升的迷津.就在第

Java程序优化的一些最佳实践

摘要:本文介绍了Java代码优化的过程,总结了优化Java程序的一些最佳实践,分析了进行优化的方法并解释了性能提升的原因.多角度分析导致性能低的原因并逐个进行优化使得程序性能得到极大提升,代码可读性.可扩展性更强. 作者通过经历的一个项目实例,介绍Java代码优化的过程,总结了优化Java程序的一些最佳实践,分析了进行优化的方法,并解释了性能提升的原因.作者从多个角度分析导致性能低的原因,并逐个进行优化,最终使得程序的性能得到极大提升,增强了代码的可读性.可扩展性. 一.衡量程序的标准衡量一个程

Databus:LinkedIn开源低延时变化数据捕获的系统

2月26日,LinkedIn开源了其低延时变化数据捕获系统Databus,该系统可以在MySQL以及Oracle数据源上捕获数据,不过当下LinkedIn只开源了Oracle上的连接器.Databus作为LinkedIn生态系统中的一致性保障组件,是具有十分高保障的一项产品,就算在低延时的情况下仍然具有高有效性;而其最大的特点莫过于无限制lookback能力及丰富的subscription功能. 以下为LinkedIn上Databus简述译文: 何为Databus LinkedIn拥有一个针对数

开源大数据周刊-第6期

阿里云E-Mapreduce动态 E-Mapreduce团队 正在研发1.3.2版本及1.4版本,主要包括: Master HA功能 用户执行计划及集群运行状态自定义报警 集群整体运行情况的仪表盘 集群的一些专家建议,例如:扩容提醒 集群一键重启 资讯 腾讯前副总裁.Google科学家吴军:大数据的未来就像在沙子里淘金 大数据就像在一堆沙子里面淘金.当你利用到相较于今日一万倍的数据时,量变到质变的跃升就很可能产生.从这个意义上来讲,未来所有的公司,都可能是要使用大数据的公司. 窥探大数据应用市场