ActiveX需要实现哪些COM接口

时间:2022-06-12 21:01:17

CoCreateInstance内部调用CoGetClassObject,搜索注册表,获得该COM类所在的DLL位置并加载,通过调用在该DLL导出的函数获DllGetClassObject得接口类的Class Factory,通过调用该类厂的的方法CreateInstance最终获得需要的接口指针。
当要创建一个COM类的多个实例时,应该直接调用CoGetClassObject获得类厂指针,然后调用类厂的方法CreateInstance创建接口。CreateComObject–>CoCreateInstance–>CoGetClassObject–>DllGetClassObject–>CreateInstance

ActiveX控件基于构件对象模型COM,使得ActiveX控件成为可能的COM的基本原则是一个对象的接口和其实现能够而且应该分开对待。只要COM的对象和它的客户方代码就接口细节达成了一致,如何实现就不成其问题。ActiveX 控件展示了大量ActiveX控件包容器理解的接口。因为客户方代码和控件认可这些接口的外在表现,你可以编写一个ActiveX控件然后简单的将它放入包容器中。包容器将通过良好定义的接口来驱动控件,而这些控件将以自己的方式做出合适的响应。在更高的层次上,一个ActiveX控件是实现了几个主要 ActiveX技术的一个COM对象,包括通常的引入COM接口,OLE嵌入协议,连接点和属性页。在较低的编程层次上,ActiveX控件只是实现了某些类型接口的COM类。当一些客户方代码成功的查询到这些接口之一时,它就知道如何使用一个ActiveX控件了。

一个ActiveX控件暴露的接口主要分为3类。第一,ActiveX控件是可嵌入的对象;就是说,它们实现了大多数的OLE文档、in-place激活和嵌入协议。ActiveX控件实现了如下的接口:IOleObject, IPersistStorage, IDataObject, IOleInPlaceActiveObject, IOleInPlaceObject, IViewObject2和IRunnableObject (这一个很少用到). 第二ActiveX控件通常都支持属性页,这样客户方就可以修改控件的属性了。最后,ActiveX控件通常都利用COM的连接点技术,实现了客户方能发现的外出接口。

组件是接口的集合,接口是函数的集合
接口的不变性,接口一旦公布,就永不能该变
所有的COM接口都必须支持一个IUnknown接口,定义与UNKNWN.H头文件中。此接口包含三个函数。所以组件的任何一个接口都可以被客户用来获取它所支持的其它接口,所以任何一个接口指针都可以被当作 IUnknown接口指针,客户通过IUnknown *CreateInstance()来获得IUnknown接口指针,然后可以通过调用QueryInterface函数询问组件是否支持某个特定接口,若支持,则QueryInterface返回指向该接口的指针,否则返回一个错误码

因为接口实质是一个函数指针,所以保存接口需要指向指针的指针. QueryInterace查询IUnknown接口时,无论从哪个接口指针调用的 QueryInteface,其返回的IUnknown接口指针都是相同的,即指向同一个地址。因此当判断连个接口是否指向同一组件的时候,可以从这两个接口返回IUnknown接口指针进行比较.
对QueryInterface而言一个IID就是一个接口

一个ActiveX控件就是一个实现了IUnknown接口并且支持自注册的简单的COM组件.但是实现一个IUnknown接口的控件显然是没有实际用处的, 所以真正的ActiveX控件还是要实现原先OCX控件定义的一些接口, 用来和它的容器进行交互操作. 下面简要的说明一下一个真正的 ActiveX控件的实现.除了IUnkown接口外, 一个ActiveX控件一般要实现下面接口中的一部分. IOleObject,IOleInPlaceObject,IOleInPlaceActiveObject,IOleControl, IDataObject,IViewObject2, IDispatch, IConnectionPointContainer, ProviderClassInfo[2], ISpecifyPropertyPages, IPerPropertyBrowsing, IPersistStream, IPersistStreamInit,IPersistMemory, IPersistStorage, IPersistMoniker, IPersistPropertyBag,IOleCache[2],IExternalConnection,IRunnableObject, IClassFactory

IOleObject 要与包容器程序的站点对象进行通信,则须实现此接口

IOleInPlaceObject和IOleInPlaceActiveObject 支持实地激活特性

IOleControl   控件支持快捷键,或者访问包容器的环境属性,或者控件要求包容器处理事件

IViewObject2 在非实地激活状态下也需要显示信息

IDispatch   有自定义的属性和方法

IPersistStream[Init]和IPersisStorage 支持永久特性的


http://hi.baidu.com/ncudlz/item/4613f72fa571eb86ae48f525