组件对象模型

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

组件对象模型

控件和组件是什么

一般把Control翻译成控件,把Component翻译成组件。

控件就是具有用户界面的组件。要说的具体一点,就得回顾早期 Windows 的历史根源,当时控件指任何子窗口——按钮、列表框、编辑框或者某个对话框中的静态文本。从概念上讲,这些窗口——控件——类似用来操作收音机或小电器的旋钮和按钮。随着控件数量的增加(组合框、日期时间控件等等),控件逐渐成为子窗口的代名词,无论是用在对话框中还是用在其它种类的主窗口中。没过多久 BASIC 程序员开始编写他们自己专用的控件,自然而然地人们便想到共享这些控件。共享代码的方法之一是通过磁盘拷贝,但那样显然效率低下。必须要有一种机制使开发者建立的控件能够在其它程序员的应用中轻而易举地插入,这便是VBA控件,OLE控件,OCX和最后ActiveX 控件的动机。

这就是控件和组件之间产生混淆之所在。因为为了解决控件的可复用问题,所有这些技术必须首先解决更为一般的组件重用问题。(COM,如果你还记得它的话,意思是组件对象模型)。在软件行话中,组件这个术语指任何可复用的对象或任何可与其它对象交互的代码体。子程序的发明,曾经一度成为程序员趋之若鹜的软件工程圣杯:一种统一的编程理论,它使程序员从基本构建块——也就是用所选语言编写的各种组件建立大型系统。从子程序演变到OOP,到DLLs,再到COM,再到.NET框架的每一种新的编程范例都代表了一种不同的提供可重用性的方案。VBX使用DLLs的固化名称。COM使用接口和IUnknown。.NET框架使用微软的中间语言(MSIL)层和公共语言运行时(CLR)来提供统一的粘合。

因此,控件是组件的一个主要样本(并且历史上曾驱动着组件的开发),控件又不仅仅是唯一的一种组件。组件不需要显示任何信息或用户界面。组件可能实现科学计算,收集性能数据。

规则1:必须实现Iunknown

IUnKnown接口的定义: IUnKnown是一个接口。所有COM接口都继承IUnKnown。IUnKnown的定义在WIN32 SDK中的UNKNWN头文件中。

深入:

COM组件其实是一种特殊的类,遵循一个统一的标准,使到各个软件都可以

通过某种方法访问这个类的函数和方法,也就可以做到组件通用. com就是统一的标准--通过接口来调用com组件.接口是你的com组件能被外界所感知的部分,实际就是一组方法(虚函数).

IUnknown是所有接口的基础,他负责两项工作:

IUnknown::QueryInterface负责得到该组件的其他接口的指针

IUnknown::AddRef/Release负责管理该组件的生存期,但有人使用该组件时,保证该组件不会被意外删除;再没人使用该组件时,保证该组件被自动删

COM是组件对象模型,她是继面象对向之后的一种思想,而不是一种简单的实现。

通过IDL,很多具体的工作都可以实现她,如VC、VB等。

一句话:COM是接口(组件)的集合,接口是方法和属性的集合。

要了解COM,就得先了解IUnknown接口,IUnknown接口的C++形式的定义如下:

interface IUnknown

{

virtual HRESULT _stdcall QueryInterface([in]REFIID iid,[out] void * * ppv)=0;

virtual ULONG _stdcall AddRef(void)=0;

virtual ULONG _stdcall Release(void)=0;

}

她实现了“接口查询”和“引用计数”,她是一个纯抽象基类。所有COM

定义的接口都必须从她继承。

实现的COM接口都应该遵守一定的原则:

1。查询IUnknown接口得到的必须一样。

2。接口对称性。

3。接口相互性。

4。接口传递性。

5。时间无关性。

要学好COM,一定得弄清楚COM的原理。

如果你学过C++或类似语言的话,这就比较好理解了。在C++里,一个子类可以从父类继承,这样子类可以复用父类的函数和成员。在COM里,一个接口和一个类很相似,一个接口可以从另一个接口继承,但是与C++的区别是,接口的继承只是继承说明,不继承实现。微软规定了所有的标准接口必须从IUnknow n接口“继承”,以获得组件的两个基本能力:引用计数和查询接口。

一个Free的域名:,现在放了一位老外写的学习心得。

IUnknown接口是一个很普通的类或结构,你甚至可以自己写他,只是他有特殊的规定,必须有QueryInterface,AddRef,Relaese方法。可以说他是所有C OM类的基类。原始的IUnknown类是一个纯虚类,什么也不能干,用户必须重载并实现他的所有方法,之所以要用IUnknown虚拟类,只是为了接口统一。也就是说所有COM类这三个方法的地址在函数虚拟表中是完全一样的。

COM中的接口和C++中的类有些是相同的,但是也有一些区别,在COM中有一些接口他里面有些函数是微软在出厂时就已经编写好了的,但是,他也提供了一些多余的接口,他只做了定义,但是没有实例化,你可以利用VC编写程序了将他实例化,就可以实现自己要求的功能了,但是你也要编写一个注册程序,至于如何编写要看你利用的接口而定了。

有一套教程,非常好,有生动的例子和循序渐进的说明。最终的结论是,要在Windows平台上实现组件(可独立发布的程序单元)应该是COM现在这种形式。URL为:/com/contents.asp比较适合于初学者,只需C++的基础,学起来也比较轻松。学完之后,比看任何一本关于COM的书都要理解得好。

如果一个对象没有至少实现一个最小程度为IUnknown的接口,那它就不是Microsoft的组件对象模型(COM)。

接口设计规则

接口必须直接或间接地从IUnknown继承。

接口必须有唯一的识别(IID)。

接口是不变的。一旦分配和公布了IID,接口定义的任何因素都不能被改变。

接口的成员函数应该有HRESULT类型的返回值,使远端结构可报告远程过程调用(RPC)错误的情况。

接口成员函数的字符串参数应该是Unicode。

实现 IUnknown

对象的同一性。这要求对任何特定IUnknown接口的给定对象实例的QueryInterface调用返回相同的物理指针变量。这导致了所谓的两个接口的QueryInterface(IID_IUnknown, ...)和结果的比较,以确定它们是否为同一对象(COM对象同一性)。

静态接口的设置。任何经由QueryInterface来访问对象的接口的设置,必须是静态而不是动态的。也就是说,假如一旦QueryInterface获得了一个给定的IID,那么它总是对相同的对象(除非有意想不到情况)调用,假如QueryInterface不能获得一个给定的IID,那么随后对相同IID的对象调用必定会失败。

对象完整性。对于可处理的接口设置,必须有反身性,对称性和过渡性。即给定代码如下:

IA * pA = (some function returning an IA*);

IB * pB = NULL;

HRESULT hr;

相关文档
最新文档