`

COM原理及应用----COM对象和接口

    博客分类:
  • COM
阅读更多

1、COM对象的理解

   COM对象类似于C++语言中类的概念,类的每个实例代表一个COM对象,它也包括属性(即状态)和方法(即操作),状态反映对象的存在,方法就是接口。

 

2、COM对象的标识-CLSID

GUID是一个128位的随机数,重复概率极低。它的值来源于两部分:空间值(网卡地址或随机数)和时间值。

获得GUID值可以使用VC++提供的工具:GUIDGen.exe 和 UUIDGen.exe。或者使用COM库的API函数CoCreatGuid()。

 

3、COM对象与C++对象的比较

COM对象将数据完全封装在对象的内部。C++对象的封装是在语义上的封装,通过不同的数据类型实现数据的封装。

COM对象的可重用性通过包容和聚合实现。C++对象的可重用性通过类的继承来实现。

COM对象的多态性通过其接口体现,C++对象的多态性通过其虚函数体现。

 

4、COM接口的作用和意义

COM规范的核心内容是关于接口的定义,虽然COM本身并不复杂,但是围绕COM接口有很多内容值得仔细探讨,包括接口的标识、接口函数的调用习惯、参数处理、接口与对象的关系以及接口与C/C++的关系、COM接口多具有的特性等。

COM定义了一套完整的接口规范,不仅可以弥补API作为组件接口的不足,还从分发挥了组件对象的优势,并实现了组件对象的多态性。

 

5、接口定义和标识

从技术上讲,接口是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能。

客户程序用一个指向接口函数结构的指针来调用接口成员函数。实际上接口指针指向另一个指针pVtable。

接口函数表称为虚函数表(Virtual Function Table ,简称vtable),指向vtable的指针为pVtable。对于一个接口来说,它的虚函数表vtable是确定的。

 

6、接口设计的问题

在接口成员函数中,字符串变量必须用Unicode字符指针,这是COM规范的要求。

COM API函数使用大多数语言惯用的_stdcall调用习惯。

用C语言定义COM接口,需要有结构体struct定义其接口结构,接口成员函数必须有一个this指针。

用C++语言定义COM接口,因为由C++语言class的实现机理可以看出,COM接口结构中的vtable与class的vtable(类的虚函数表)完全一致,因此,用class描述COM接口是最方便的手段。此时,接口成员函数隐藏了this指针。

class 型接口的说明要比struct 型接口的说明简捷得多。

 

7、COM接口与对象的联系

接口类只是一种描述,并不提供具体的实现过程。如果COM对象要实现接口,则COM对象必须以某种方式把它自身与接口类联系起来,然后把接口类的指针暴露给客户程序,于是客户程序就可以调用对象的接口功能了。

用 class型接口通过把接口指针(this)与对象数据绑定在一起的方法实现对COM接口的支持比较直观、简捷易于理解。实际上,也可以采用其他的方法来实现接口,只要接口成员函数中this指针(即接口指针)与对象数据能建立确定的连接,在接口成员函数中可以访问到对象数据即可。例如,VC++的MFC 库和ATL(active template library ,活动模板库)模板库分别采用了不同的机制来提供对COM接口的支持。

 

8、接口描述语言IDL

COM 规范在采用OSF的DCE规范描述远程调用接口IDL(interface description language ,接口描述语言)的基础上,进行扩展形成了COM接口的描述语言。接口描述语言提供了一种不依赖于任何语言的接口描述方法,因此,它可以成为组件程序和客户程序之间的共同语言。

COM 规范使用的IDL接口描述语言不仅可用于定义COM接口,同时还定义了一些常用的数据类型,也可以描述自定义的数据结构,对于接口成员函数,我们可以制定每个参数的类型、输入输出特性,甚至支持可变长度的数组的描述。VC++提供了MIDL工具,可以把IDL接口描述文件编译成C/C++兼容的接口描述头文件(.h)。

 

9、接口的内存模型

COM对象往往有自己的属性数据,它们反映对象的状态,并用于区分不同的对象。对于有多个对象的客户,数据属性是不能公用的。

 

10、接口的特点

二进制特性

接口不变性

继承性(扩展性):类似于C++中类的继承性,接口也可以继承发展,但方式不同。类继承不仅是说明继承,也是实现继承,即派生类可以继承基类的函数实现,而接口继承只是说明继承,即派生的接口只继承了基接口的成员函数说明,而没有继承基接口的实现。类继承允许多重继承,但接口继承只允许单继承。根据COM规范,所有接口都必须从IUnknown派生,可以直接派生,也可以间接派生。但大多数都是直接派生。OLE系统中,接口最后字母是“2”或“Ex”的,标煤它是一个继承接口。

多态性:COM对象具有多态性,其通过COM接口体现。

 

11、IUnknown接口提供了两个非常重要的特性:生存期控制(使用引用计数)和接口查询。

 

12、IUnknown接口引用计数的设置层级

引用计数在组件一级实现则计数分辨率太粗(选择全局变量),在对象一级实现恰好(使用C++类的成员变量),在接口一级实现则计数分辨率太细(使用类成员变量)。

 

13、使用引用计数的规则

根据不同场合使用或者传递接口指针标量进行分类,并给出相应的规则:

(1)函数的参数中使用接口指针变量。

输入参数:由于输入参数由调用函数控制,因此被调用函数执行过程中,接口指针一定保持有效,引用计数不需要改变。

输出参数:输出参数是指在被调用函数执行过程中进行赋值的参数,而且被调用函数并没有用到函数初始化传进来的值,输出参数相当于函数的一个返回值。在C/C++语言中,输出参数为一个指针变量(COM中不使用引用变量)。因为输出参数相当于在被调用函数中生成了一个新的接口指针变量,因此,在被调用函数返回之前,对输出参数应该调用AddRef使接口引用计数增1。这条规则也适用于函数返回值为接口指针变量的情况。

输入-输出参数:在参数被修改之前,对原来传进来的接口指针调用Release以使引用计数减1,在参数被修改之后,对新的接口指针变量调用AddRef,以标记对新的接口指针的引用。如果在函数执行过程中参数没有被修改,则不需要改变。

(2)局部接口指针变量:因为在局部函数块中,接口指针总是有效的,所以,一个局部接口指针变量被赋了值并调用了接口成员函数,引用计数不需要改变。

(3)全局接口指针变量:把全局接口指针变量作为输入参数传给某个函数之前,应该调用AddRef以保证在函数调用中可以使用给接口指针变量,因为它是全局变量,其他的函数有可能会调用Release函数。在函数返回之后应该调用Release函数。

(4)C++中类成员变量为接口指针变量:因为对于类的作用域来讲,成员变量相当于全局变量,因此适用于规则(3)。

(5)当以上情形都不适合时,使用以下一般的规则:

在顺序执行过程中,如果要对一个接口指针变量赋值,则对赋值后的接口指针变量调用AddRef,并且,如果赋值前的接口指针变量还没有结束,则赋值前必须对它调用Release以便先结束它的使用。

如果要结束使用一个接口指针变量,以后不再用到它了,则调用Release函数。

 

14、接口查询

使用QueryInterface函数查询接口,其返回值有S_OK、E_NOINTERFACE、E_UNEXPECTED。

 

15、COM对象的接口原则

(1)对于同一个对象的不同接口指针,查询得到的IUnknown接口必须完全相同。即每个对象的IUnknown接口指针是唯一的。

(2)接口对称性。即对一个接口查询其自身总应该成功。

(3)接口自反性。

(4)接口传递性。

(5)接口查询时间无关性。

 

16、多接口COM对象的实现方法

在C++语言中有两种实现方法:一是使用多重继承,把所支持的接口作为其基类,然后在对象类中实现接口成员函数;二是使用内嵌接口类成员。

分享到:
评论

相关推荐

    嵌入式系统原理及应用——基于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"的...

    COM组件的原理及应用

    这些资料对于深入理解COM组件的原理和实际应用有着极大的帮助,可以帮助读者从基础到实践,全面掌握COM组件的开发和使用技巧。 总之,COM组件是Windows编程中的重要组成部分,理解并熟练使用COM组件,可以提升...

    mybatis-plus 实践及架构原理

    Mybatis-Plus的实践及架构原理主要包含以下几个方面的知识点: 1. Mybatis-Plus的定义: Mybatis-Plus是一个Mybatis的增强工具,在保留Mybatis原有特性的同时,提供了很多便捷的功能,如代码生成器、分页插件等,...

    杨老师-COM组件设计与应用-文档和源代码

    这个“杨老师-COM组件设计与应用-文档和源代码”资源包,显然是一个深入讲解COM组件设计和应用的教学资料,包含文档和源代码两部分。下面将详细阐述COM组件的相关知识点。 1. **COM基础概念**:COM是基于接口的,它...

    《COM 原理与应用》

    ### COM原理与应用 #### COM是什么? COM(Component Object Model)是微软提出的一种软件组件标准,同时也是一种编程模型。在软件开发领域,它提供了一种跨语言、跨平台的组件通信方式,允许不同应用程序间的对象...

    面向对象原理与Java实践课程实验-对象和类

    ### 面向对象原理与Java实践课程实验-对象和类 #### 实验目的与要求 本实验的主要目的是让学生深入理解面向对象编程的核心概念之一——类与对象,并通过实际编程来掌握这些概念的具体应用。实验重点包括: 1. **...

    CORBA 原理及应用

    ### CORBA原理及应用知识点详解 #### 一、CORBA简介 - **CORBA**(Common Object Request Broker Architecture,通用对象请求代理体系结构)是一种分布式计算标准,旨在提供跨网络和平台之间的对象交互能力。 - **...

    数据库原理与应用习题答案

    数据库原理与应用是计算机科学和信息类专业的重要课程,涵盖了数据库的基础理论和实践技术。该课程涉及的关键知识点包括: 1. **数据与数据库**:数据是描述事物的符号记录,可表现为数字、文字、图像等多种形式,...

    COM原理与应用示例

    3. **IDispatch**:对于动态类型的语言,如VBA或JavaScript,COM提供了一个通用的接口IDispatch,允许这些语言在运行时发现对象的方法和属性。 4. **自动化**:COM自动化允许组件向脚本语言暴露其功能,使得非编译...

    rmi原理-chn-pdf

    ### RMI原理详解 #### 前言与背景 RMI(Remote Method Invocation,远程方法调用)是一种Java平台上的技术,它允许...通过对RMI原理的学习,我们可以更好地理解和应用这项技术,从而构建出高效、可靠的分布式系统。

    com 技术内幕 -- 微软组件对象模型(inside COM.pdf

    #### 对象和接口 在COM中,对象是实现特定功能的实体,而接口则是定义该对象如何被使用的协议。一个对象可以实现多个接口,而每个接口又定义了一组方法。通过接口,客户端可以访问对象的功能。 #### GUID 全局唯一...

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

    通过学习《Z-Stack协议栈原理及应用》PPT,读者将能掌握Z-Stack协议栈的基本概念、工作流程和编程接口,理解如何配置和优化网络参数,以及如何开发基于Z-Stack的应用程序。此外,PPT可能还包含了一些实例分析和故障...

    Java对象池技术的原理及其实现

    通过以上内容的详细介绍,我们不仅了解了Java对象池技术的基本原理及其在提高程序性能方面的应用,还掌握了实现一个完整对象池所需要的关键技术和类。这为开发高效、稳定的Java应用程序奠定了坚实的基础。

    计算机软件-商业源码-数据库原理及应用系统开发.zip

    在压缩包中的“数据库原理及应用系统开发”文件中,可能包含以上各个方面的实例代码、设计文档、教程或案例研究,对于深入理解和实践数据库开发有着极大的帮助。开发者可以通过学习这些资料,提升自己在数据库管理和...

    接口设计技巧及原理说明

    在IT行业中,接口设计是构建软件系统的...而自适应滤波器的原理虽然不在接口设计的直接范畴内,但其在实际应用中可能需要通过接口与其他系统交互,因此在设计相关接口时,需要充分考虑其实现的复杂性和动态调整的特性。

    TMS320C6000系列DSP原理与应用设计-光盘资料

    1. 本书以TI公司的TMS320C6000系列DSP为介绍的对象。 2. DSP开发环境CCS可以运行在Windows 2000或Windows XP系统下。 2 光盘内容介绍 1. 随书所赠光盘中每一个文件夹对应书中的一章。 光盘中的所有实例分别命名为...

    355.353.JAVA基础教程_面向对象(下)-接口应用:代理模式(355).rar

    在Java编程语言中,面向对象(Object-Oriented Programming,OOP)是核心特性之一,而接口(Interface)和代理模式(Proxy Pattern)是其中重要的概念。本教程将深入探讨这两个概念及其在实际开发中的应用。 接口在...

    COM原理与应用编程实例

    5. **IUnknown接口**: 所有COM对象都必须实现IUnknown接口,它提供了管理对象引用计数(AddRef、Release)和获取接口指针(QueryInterface)的方法。这是COM实现引用计数和接口透明性的基础。 6. **线程模型...

Global site tag (gtag.js) - Google Analytics