- 3
- 0
- 约3.01千字
- 约 7页
- 2018-08-11 发布于福建
- 举报
COM组件与接口研究应用
COM组件与接口研究应用
摘 要:在com组件模型中,接口是最为重要的概念,在整个应用系统中起决定性作用,外界和组件方所有的交互都通过接口实现,因此接口设计的优劣直接影响组件的质量。接口是一组方法的集合,其方法也称为接口成员函数。com组件为com对象提供活动空间,com对象以com接口的方式提供服务。在com中接口就是一切,对于客户来说,一个组件就是一个接口集,客户只要知道接口就可以对组件进行操作了。随着com技术的不断完善,com技术将得到更广泛的应用。
关键词:com组件;com接口;iunknown
一、com简介
组件对象模型(component object model,com)是微软公司于1993年创建的一种软件组件结构标准。目的是为了使应用程序更易于定制。把一个庞大的应用程序分成多个模块,每一个模块保持功能独立性,在协同工作时,通过相互之间的接口完成实际的任务。我们把每一个这样的模块称为com组件,这些组件可以在不同的计算机上用不同的程序设计语言单独开发,单独编译,单独调试和测试。当所有的组件开发完成后,把它们组合在一起就得到了完整的应用程序。com是微软的activex,directx以及ole技术的基础,它被设计成一个动态互变组件的规范,为windows程序模块之间的相互通讯提供了统一的标准,只要客户和组件共同遵循这一规范,双方就可以透明地通讯。用com开发出来的组件实际上是一些小的二进制代码,可以给应用程序、操作系统以及其它组件提供一些服务。多个com组件对象可以连接起来以形成应用程序或组件系统,并且组件可以在运行时、不重新链接或编译应用程序的情况下被卸下或替换掉。
二、com结构
在com标准中,引入了面向对象的思想,类似与c++中对象的概念,对象是某个类的一个实例,称为com对象。接口是一组方法的集合,其方法也称为接口成员函数。com组件为com对象提供活动空间,com对象以com接口的方式提供服务。 每个com组件包含多个com对象,每个com对象提供多个com接口供客户使用。com组件有两种,一是进程内组件,是一个dll(动态连接库)文件;二是进程外组件,是一个exe(可执行程序)文件。当另外的组件或普通程序(即组件的客户程序)调用组件的功能时,它首先创建一个com对象,然后通过该对象所实现的com接口调用它所提供的服务。进程内组件是dll程序,当客户调用进程内组件程序的方法时,进程内组件和客户程序在同一进程地址空间内,客户程序得到的接口指针直接指向组件的vtable其效率非常高。进程外组件是exe程序,它不能提供引出函数供其它程序调用,因此进程外组件必须支持两个命令行参数/regserver和/unregserver,以便完成组件的注册和取消注册操作。
三、com接口定义与实现
(一)接口的定义
在com中接口就是一切,对于客户来说,一个组件就是一个接口集,客户只要知道接口就可以对组件进行操作了。
接口类似与c++的抽象基类,定义一个接口意味着定义一个抽象方法的集合,这些方法会被一个类实现,用户会调用这个类的一个实例(对象)。接口是用idl(interface description language),接口描述语言)来定义的。下面是一个简单的接口文件:
total?idl.
import“unknwn.idl”
[object,uuid(ddc68871-e08e-11cf-a535-00aa00615b03)]
interface itotal:iunknown
{
hresult inputdata([in] short n);
hresult sum([out] short *psum);
}
上面定义了接口itotal。因为任何接口都是从iunknown接口继承的,所以在文件的开头包含了import指令(类似c++的include指令)。每个com接口必须有2个idl属性,object属性说明该接口是com接口,uuid属性用128位的全局唯一标识符guid(globally unique identifier)在全球范围内唯一的标识一个接口。接口方法的参数具有方向属性,in属性表示参数是输入到服务器的参数,out属性表示参数是从服务器输出的参数。上面的接口有两个方法inputdata和sum,参数n输入到服务器,然后服务器计算1+2+…+n的和,通过psum参数把计算结果传回到客户。hresult返回值检查执行是否成功或失败。
(二)接口的内存结构
客户用一个指向接口的指针来调用接口方法,接口指针又指向另一个指针pvtable, pvtable指向接口函数表
原创力文档

文档评论(0)