第7章 C++继承和多态3

面试题20 什么是COM

【解析】
COM即组件对象模型,是Component Object Model取前3个字母的缩写,这3个字母在当今Windows的世界中随处理可见。随时涌现出来的大把新技术都以COM为基础。各种文档也充斥着诸如COM对象、接门、服务器之类的术语。

简单地说,COM是一种跨应用和语言共享二进制代码的方法。与C++不同,它提倡源代码重用。源码级重用虽然好,但只能用于C++。它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。
Windoes使用DLLS(动态链接库)在二进制级共享代码。这也是Windows程序运行的关键————重用 kernel32.dll,user32.dll等。但DLLs是针对C接口而写的,它们只能被C或者理解C调用规范的语言使用的。由编程语言来负责实现共享代码,而不是由动态链接库本身,这样的话,动态链接库的使用受到限制。
COM通过定义二进制标准解决了这些问题。这是因为 COM 明确指出二进制模块(动态链接库和可执行文件)必须被编译成与指定的结构匹配。这个标准也确切地规定了在内存中如何组织 COM 对象。COM定义的二进制标准还必须独立于任何编程语言(如C++中的命名修饰)。一旦满足这些条件,就可以轻松地从任何编程语言中存取这些模块。由编译器所负责产生的二进制代码与标准兼容。这样使后来的人就能更容易地使用这些二进制代码。
在内存中,COM对象的这种标准形式在C++虚函数中偶尔用到,所以这就是许多COM代码使用C++的原因。
但是记住,与编写模块所用的语言无关,因为结果二进制代码为所有语言可用。
【答案】
COM即组件对象模型,它定义了一种二进制标准,使得任何编程语言存取它所编写的模块。


面试题21 COM组件有什么特点

【答案】
COM组件是遵循COM规范编写、以Win32动态链接为患 (DLL)或可执行文件(EXE)形式发布的可执行二进制代码,
能够满足对组件架构的所有需求。遵循COM的规范标准,组件与应用、组件与组件之间可以互操作,极其方便地建立可伸缩的应用系统。COM是一种技术标准,其商业品牌则称为ActiveX。
组件在应用开发方面具有以下特点。
(1)组件是与开发工具语言无关的。开发人员可以根据特定情况选择特定语言工具实现组件的开发。编译之后的组件以二进制的形式发布,可跨Windows平台使用,而且源程序代码不会外泄,有效地保证了组件开发者的版权。
(2)通过接口有效保证了组件的复用性。一个组件具有若干个接口,每个接口代表组件的某个属性或方法。其他组件或应用程序可以设置或调用这些属性和方法来进行特定的逻辑处理。组件和应用程序的连接是通过其接口实现的。负责集成的开发人员无须了解组件功能是如何实现的,只需简单地创建组件对象并与其接口建立连接。在保证接口一致性的前提之下,可以调换组件、更新版本,也可以把组件安插在不同的应用系统中。
(3)组件运行效率高,便于使用和管理。因为组件是二进制代码,所以运行效率比ASP脚本高很多。核心的商务逻辑计算任务必须由组件来担当,ASP脚本只起组装的角色。而且组件在网络上的位置可被透明分配,组件和使用它的程序能在同一进程中、不同进程中或不同机器上运行。组件之间是相互独立的。组件对象通过一个内部引用计数器来管理它自己的生存期,这个计数器存放任何时候连接到该对象的客户数。当引用计数变为0时,对象可以把自已从内存中释放掉。这使程序员泌考虑与提供可共享资源有关的问题。


面试题22 如何理解COM对象和接口

【答案】
       一个对象实现一个接口,意思就是该对象使用代码实现了接口的每个方法并且为这些函数通向COM库提供了COM的二进制指针。然后COM使这些函数运行在请求了一个指向该接口的任何客户端。
      COM在接口的定义和实现上有根本的差别。接口实际上是由一组定义了用法的相互联系的函数原型组成,只是它不能够被实现。这些函数原型就相当于C++中含有纯虚函数的基类。
       一个接口定义制定了接口的成员函数、调用方法、返回类型,它们的参数的类型和数量,以及这些函数要干什么。但是,这里并没有与接口实现相关的东西。
       接口的实现就是程序员在一个接口定义上提供的执行相关动作的代码。客户调用完全决定于接口的定义。接口实现的一个实例,实际上就是一个指向一组方法的指针,即是指向一个接口的函数表,该函数表引用了该接口所有方法的实现。每个接口是一个固定的一组方法的集合,在运行时通过globally unique interface identifier(IID)来定位。这里,IID是COM支持的globally unique identifier(GUID)的特殊的实例。这样做就不会产生单一系统上相同名字、接口的多个版本的COM之间的冲突了。
       一个COM接口与C++类是不一样的。一个COM接口不是一个对象,它只是简单地关联一组函数,是客户和程序之间通信的二进制标准。只要它提供了指向接口方法的指针,这个对象就可以用任何语言来实现。COM接口是强类型的————每个接口有它自己的接口标识符。另外,不能用老版本的接口标识符定义新的版本,接口的IID定义的接口合同是明确、唯一的。
       继承在COM里并不意味着代码的重用。因为接口没有实现关联,接口继承并不意味着代码继承。意思仅仅是,一个接口同一个合同关联,就像C++的纯虚基类的创建和修改一样,可以添加方法或者更进一步的加强方法的使用。在COM里没有选择性继承。如果一个接口由另一个接口继承的话,它就包含了另一个接口定义的所有的方法。
管理实现一个COM对象的IUnknown::QueryInterface方法有3个主要规则:
(1)对象必须有一个标识符。
(2)一个对象实例的接口集合必须是静态的(static)。
(3)在对象中从任何一个其他的接口查询此接口都应该成功。


面试题23 简述COM、ActiveX和DCOM

【答案】
       COM(Component Object Mode)即组件对象模型,是组件之间相互接口的规范。其作用是使各种软件构件和应用软件能够用一种统一的标准方式进行交互。COM不是一种面向对象的语言,而是一种与源代码无关的二进制标准。
       ActiveX是Microsoft提出的一套基于COM的构件技术标准,实际上是对象嵌入与链接(OLE)的新版本。
       基于分布式环境下的COM被称作DCOM(Distribute COM,分布式组件对象模型),它实出了COM对象与远程计算机上的另一个对象之间直接进行交互。DCOM规范定义了分散对象创建和对象间通信的机制,DCOM是ActiveX的基础,因为ActiveX主要是针对Internet应用 开发(相比OLE)的技术,当然也可以用于普通的桌面应用程序。

 


面试题24 什么是DLLHELL

【答案】
       DLL HELL主要是指DLL(动态链接库)版本冲突的问题。一般情况下,DLL新版本会覆盖旧版本,那么原来使用旧版本的DLL的应用程序就不能继承正常工作了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值