`

COM原理及应用----可连接对象

    博客分类:
  • COM
阅读更多

1、COM的高级特性

       COM规范中有一些高级特性,如可连接对象、永久存储、一致的数据传输等,使COM规范具有更强的生命力,它们也是OLE的基础,但它们的应用又不仅仅局限于OLE,这些高级特性已经广泛应用于Windows操作系统上。

 

2、入接口、出接口与接收器

       入接口(incoming interface)是组件暴露给客户,被动地监听并为客户请求作出反应的接口。而出接口(outgoing interface)是指组件主动与客户进行通信的接口。

       出接口不是由对象实现的,而是由客户程序来实现,客户实现这些接口,并把接口指针告诉对象,以后对象利用此接口指针与客户进行通信。在客户程序方,实现这些接口的对象被称为接收器(sink)。接收器本身也是一个COM对象,但它往往比较简单,只用于监听处理组件对象的通知或请求。

       客户与对象之间的关系是相对的,入接口和出接口也是一个相对概念,它们只用于通信的一个方向。

 

3、可连接对象

       如果一个COM对象支持一个或多个出接口,则称这样的对象为可连接对象(connectable object),或称为源对象(source)。

       可连接对象的出接口也是COM接口,它包含一组成员函数,每个成员函数代表了一个事件(event)、一个通知(notification)或者一个请求(request)。

 

4、事件、通知与请求

       事件和通知在概念上是完全一致的,只是用在不同的场合,例如在COM对象中当某个属性被改变时,它可以给客户发送一个通知;而当特定事情发生时,比如定时消息或用户鼠标操作发生时,对象产生一个事件,客户程序可以处理这些事件。然而,请求的概念则稍有不同,对象给客户发出请求,它希望客户能提供某些信息,期望客户能有应答。

       从COM规范的意义上来讲,不管是事件、通知还是请求,它们都通过出接口的成员函数来实现。

 

5、客户与可连接对象的关系


       虽然接收器也是一个COM,但它有特殊性,它位于客户程序内部,并不需要通过COM库来创建,所以接收器并不需要CLSID来标识,也不需要类厂,接收器的标识和创建过程完全是客户程序内部的事情。对于客户程序外部而言,接收器也是一个单独的COM对象,它有自己的引用计数,有自己的接口查询方法,即 QueryInterface成员函数。COM只要求接收器是一个独立的COM对象,COM规范对接收器的实现没有任何限制。

       一般可连接对象不应该向接收器对象请求其他的接口,即不应该调用接收器的QueryInterface成员函数。接收器通常专用于某个出接口指针,接收器对象只实现该出接口,当然出接口是基接口(比如IUnknown)除外。

       可连接对象和接收器可以形成一对多或者多对一的关系,也即客户与可连接对象之间可以是一对多或者多对一的关系。

 

6、可连接对象的基本结构


       可连接对象可以支持一个或多个出接口,它通过接口IConnectionPointContainer管理所有的出接口。对应于每个出接口,可连接对象又管理了一个称为连接点(connection point)的对象,每一个连接点对象实现了IConnectionPoint接口,客户通过连接点对象建立接收器与可连接对象的连接。连接点即可以访问可连接对象的内部信息,也可以访问客户方的接收器,而其它可以直接使用可连接对象的引用计数器。

 

7、枚举器

       在COM规范中,枚举器(Enumerator)只是一个概念,没有确定的接口用于规定枚举器的各项操作,这是因为枚举器所枚举的数据单元的类型不确定,所以也无法给出确切的定义。客户程序利用枚举器对COM对象中的数据单元进行枚举操作,枚举器把客户对数据单元的操作进行了标准化,因此,COM对象可以按照标准的方法把数据提供给客户,而不必建立二者之间新的协议。

       因为枚举器对象是一个内部对象,它只需暴露枚举接口,不需要CLSID和类厂,所以枚举器对象的实现比较简单,只需实现枚举操作并控制好引用计数即可。

客户的接收器与源对象的连接点建立连接时,源对象使用连接点枚举器管理连接点对象,连接点对象又用连接枚举器管理连接,通过两层结构建立对象与接收器之间的连接。把源对象与连接点对象分开实现,可以使它们各自保持一定的独立性。源对象与接收器之间的连接具有很好的扩展性,而且连接点对象的独立性也使得COM可连接对象机制更具灵活性和广泛性。

 

8、接收器的实现

       在C++语言中,用一般的类从接口类派生,然后分别实现接口成员函数即可。客户程序在建立连接之前,要先创建接收器对象,因为接收器是客户程序的内部对象,所以在C++语言中可以用new操作符创建接收器对象,然后用此连接器对象建立它与源对象之间的连接。

 

9、事件的激发和处理

       实现事件和请求是可连接对象机制的主要目标。事件即可由源对象的入接口成员函数激发,也可以由用户的某些操作引起,还可以由其它对象或客户调用而引起。总之,在源对象执行过程中,根据需要都可以激发事件或者向客户发出请求,事件和请求在程序逻辑上完全一致。

       由于事件或请求是在每个连接上进行的,只有建立了连接的接收器对象才会收到事件或请求。

       连接点对象和接收器对象肯能位于不同的进程中,甚至在不同的机器环境中。因此,事件从激发到处理不一定是直接的函数调用,这是可连接对象机制与一般回调函数机制的重要不同。只有在单线程模型下,连接点对象才直接调用接收器对象的事件控制函数。从连接点对象到接收器对象之间的通信过程与以前讨论的客户和对象之间的通信过程一样,也符合COM线程模型规范,必要时侯也需要进行列集处理。

 

10、出接口通信连接的建立

       首先客户方通过源对象的IConnectionPointContainer接口得到源对象的出接口IID,并进一步向源对象请求 IProvideClassInfo接口,调用IProvideClassInfo::GetClassInfo成员函数得到ITypeInfo结构,再进一步得到出接口的ITypeInfo结构而获取接口的所有类型信息,包括成员函数、函数参数的个数和参数类型等。类型信息是客户和源对象双方的通信协议标准。

       根据出接口的类型信息在程序运行过程中实现动态接收器对象很不容易。虽然可连接对象提供了完善的双向通信机制,但客户要在运行过程中根据源对象的类型信息响应事件或请求并不容易。为此,OLE发展了COM的可连接对象的机制,它使用IDispatch接口作为出接口,利用IDispatch接口中方法(method)的分发功能实现事件控制函数。IDispatch接口的主要特点是,它可在运行时刻而不是在编译时刻把成员函数与特定的分发ID进行绑定操作,这种特性称为迟绑定(late binging)。IDispatch接口是Microsoft实现自动化技术的基础,现在已经得到了广泛的应用。

 

11、用IDispatch接口作为出接口

       IDispatch接口是自动化对象的基本接口,在高级语言或者脚本语言中,可以直接用符号化的名字即字符串访问自动化对象的属性(property)和方法(method)。使用IDispatch接口有三方面的显著有点:第一,用名字访问属性和方法非常简单易用;第二,自动化对象的IDispatch 接口的vtable是固定的,在有些高级语言或脚本语言中没有指针数据类型,所以在这些语言中描述自定义接口比较困难;第三,IDispatch接口支持迟绑定特性,可以在运行过程中根据名字访问属性或方法。

       COM已经提供了IDispatch接口的代理对象(proxy)和存根对象(stub),所以,使用IDispatch接口作为出接口可直接用于进程外源对象的出接口。

       IDispatch接口把所有的调用都通过其成员函数Invoke来实现,并且它提供了管理属性和方法的分发ID机制,以及一套描述参数和返回值的方法,所以使得运行时刻动态绑定属性和方法并进行参数类型检查成为可能。可以说Invoke函数是自动化对象的命令翻译器。

       根据不同的开发环境和运行环境,实现Invoke函数可以采用不同的方法。如果在编译时刻可以决定客户应该响应那些事件或请求,则可以在程序中建立一张表,把每个事件或请求的分发ID和对应的控制函数作为表项放到表中,把这张表称为事件映射表。MFC的COleControl类使用这种方法处理 ActiveX控制的事件和请求。


       利用IDispatch接口作为出接口可以很好地解决接收器的动态创建过程。利用IDispatch接口作为源对象的出接口,由源对象提供出接口的类型信息,即事件控制函数的所有信息,客户程序根据这些类型信息,在Invoke函数中调用相应的事件控制函数。

 

12、MFC对连接和事件的支持

       (1)MFC实现了连接点类CConnectionPoint,CConnectionPoint实现了IConnectionPoint接口,它用一个数组枚举器管理连接;

       (2)CCmdTarget也提供了一组宏支持连接点对象;

       (3)CCmdTarget类有一个内嵌的结构成员m_xConnPtContainer专门用于存放接口IConnectionPointContainer的vtable和偏移量;

       (4)连接点是可连接对象的核心,但连接点的主要目的是激发事件或发送请求,因此,我们应该对每个事件或请求编写一个激发函数。

       MFC提供了类COleDispatchDriver,他主要用于IDispatch接口的客户方调用操作,利用COleDispatchDriver的成员函数,客户可以创建自动化对象,也可以把COleDispatchDriver对象与某个自动化对象联系起来,更有意义的是,COleDispatchDriver使得IDispatch::Invoke调用的参数处理更为简单。

 

13、用CCmdTarget实现源对象的程序结构图

分享到:
评论

相关推荐

    嵌入式系统原理及应用——基于ARM Cortex-M3内核的STM32F103系列微控制器.zip

    1.5.6汽车电子31◆嵌入式系统原理及应用目录1.5.7金融商业31 1.5.8生物医学32 1.5.9信息家电32 1.6本章小结34 习题134 第2章嵌入式系统开发35 2.1嵌入式系统的开发环境、开发工具和调试方式35 2.1.1嵌入式...

    数据库原理与应用-东南大学-徐立臻教授.zip

    数据库原理与应用是计算机科学中的一个核心领域,它涉及到数据的组织、存储、检索和管理。这门课程由东南大学的徐立臻教授讲授,旨在深入探讨数据库系统的概念、设计与实现。在这个名为"DatabaseStudy-master"的...

    Java数据库连接池的原理与应用.pdf

    Java数据库连接池的原理与应用 在Java开发领域,数据库连接池(Database Connection Pool,简称DBCP)是一种提高数据库访问性能、降低资源消耗的...掌握连接池的原理与应用,对于Java开发者来说是必不可少的一项技能。

    数据库原理及应用

    ### 数据库原理及应用知识点详解 #### 一、程序与数据的关系 - **定义**:在计算机信息系统中,数据和程序是两种最基本的存在形式。其中,程序是指令的集合,用于控制计算机的操作;数据则是程序处理的对象,可以...

    《数据库原理及应用试卷》

    **数据库原理及应用试卷** 数据库原理是计算机科学中的核心课程之一,主要研究如何在计算机系统中组织、存储和检索数据。广东工业大学的这份2006-2007年度的数据库原理考试试题,为我们揭示了该课程可能涵盖的重要...

    DBSCAN算法的基本原理及实现-dbscan.zip

    这些核心对象之间的邻域相互连接,形成一个连续的高密度区域,从而构成一个聚类。而那些邻域内点数不足的点,则被视为边界对象或噪声。 在DBSCAN中,有两个关键的参数:ε(Epsilon)和minPts。ε是一个距离阈值,...

    数据库连接池原理

    - 应用程序频繁创建和关闭连接会导致大量的临时对象生成,从而增加垃圾回收的压力。 - 连接关闭后,客户端会出现大量TIME_WAIT的TCP状态。 - **使用连接池的网络交互** - 使用连接池后,首次访问数据库时需要建立...

    简单数据库原理及应用ppt

    在本资料中,我们主要探讨的是“数据库原理及应用”,这通常涵盖数据库的基础概念、设计、操作以及SQL Server的使用。 首先,让我们从“数据模型”开始,这是数据库设计的基石。2-数据模型.ppt可能涵盖了三种基本的...

    book_Z-Stack协议栈原理及应用ppt

    《Z-Stack协议栈原理及应用》是一本深入解析Zigbee无线通信技术的专业书籍,主要围绕Z-Stack协议栈的架构、功能、工作原理及其在实际应用中的具体实现进行详细阐述。Z-Stack是Zigbee联盟为Zigbee设备提供的一种标准...

    dbus-core详解

    应用程序能够向用户的会话、整个系统乃至远程系统展示面向对象的API,从而为IPC带来了面向对象编程的全部能力。例如,许多应用程序可以实现一个标准化的接口,以便与任何客户端无缝协作。 D-Bus工作原理分为几个...

    数据库连接池的图解原理

    - `con`:数据库连接对象。 - `inUse`:是否正在使用中的标志。 - `lastAccess`:最后一次使用的时间戳。 - `useCount`:使用次数。 此外,还需要一个额外的类作为其他进程获取和归还连接的接口。 #### 五、连接池...

    单片机原理与应用技术

    ### 单片机原理与应用技术 #### 一、单片机概述 ##### 1.1 单片机定义与特点 单片机是一种集成电路芯片,它将微处理器、存储器、输入输出接口等基本计算机功能集成在一个芯片上。单片机具有体积小、可靠性高、成本...

    RabbitMQ客户端连接池的原理及源码

    3. **连接对象(Connection)**:RabbitMQ客户端与服务端的通信通道,通过它可以创建信道(Channel)进行实际的消息操作。 4. **对象池策略(Pooling Strategy)**:定义了连接的分配和回收规则,例如线程局部连接、...

    jvm原理机器调优-jvm.zip

    通过理解JVM的工作原理和调优技巧,我们能更好地处理内存管理、垃圾收集等问题,提高应用的运行效率和响应速度,同时降低系统的资源消耗,确保服务的稳定性和可靠性。在实际项目中,结合具体情况灵活运用这些知识,...

    HCIP-Big Data培训视频教程【共43集】.rar

    目录: 网盘文件永久连接 01大数据行业与技术趋势 02 FusionInsight HD 03 HDFS分布式文件系统技术 04-06 MapReduce和Yarn分布式计算引擎技术 07 第一周回顾 08-09 HBase_技术原理 10 Hive技术原理 11 ...

    dbcp连接池所需jar(commons-collections-3.1.jar,commons-dbcp-1.2.jar,commons-pool-1.6.)

    DBCP(Database Connection Pool)是Apache组织提供的一个开源数据库连接池组件,它的全称为"Jakarta Commons DBCP"。...不过,对于理解数据库连接池的工作原理和使用,DBCP仍然是一个很好的学习起点。

    数据库原理及应用(SQL Server 2008)

    《数据库原理及应用(SQL Server 2008)》是一门深入探讨数据库管理系统理论与实践的课程,特别关注微软的SQL Server 2008版本。这门课程旨在教授如何设计、创建、管理和优化数据库,以满足各种业务需求。通过11个...

    数据库原理和应用试题(卷)--含答案解析.doc

    数据库原理和应用试题涉及到多个方面的知识点,以下是这些知识点的详细说明: 1. **数据库系统概论**: - 数据库管理系统(DBMS)是数据库系统的重要组成部分,它负责管理和控制数据库。 - 数据库的三级模式包括...

    HCNA-Storage V3 BSSN培训教材

    - 存储数据处理与通信协议(如FCoE、IB、iSCSI)原理及应用 - 存储系统数据可靠性与业务连续性保障技术 - 存储与主流操作系统平台的连接与应用 - 存储网络冗余技术及应用 - 存储系统网络规划与方案部署 - 虚拟...

    Qt核心机制、Qt元对象系统、Qt信号槽原理

    对象能够支持动态属性和连接信号与槽呢?这就引出了 Qt 的元对象系统。元对象系统是 Qt 为了解决 C++ 静态类型的限制而设计的一种机制,它允许在运行时动态地添加和修改对象的属性,以及实现对象之间的通信。 1. **...

Global site tag (gtag.js) - Google Analytics