接口支持的含义
除了 IUnknown 接口,ActiveX 控件或 COM 对象还通过其他接口表达它所支持的任何可选功能。 也就是说,IUnknown 之上不需要其他接口。 为此,下表列出了 ActiveX 控件可能支持的接口,以及支持该接口的意义。
接口 | 注释/支持接口的含义 |
---|---|
IOleObject |
如果控件需要与其客户端站点进行除事件以外的任何通信(请参阅 IConnectionPointContainer),则 IOleObject 是必需的。 实现此接口时,控件还必须支持以下方法的语义:SetHostNames、Close、EnumVerbs、Update、IsUpToDate、GetUserClassID、GetUserType、GetMiscStatus 和 Advise、Unadvise 和 EnumAdvise 方法与容器的 IAdviseSink 实现协同工作。 实现 IOleObject 的控件必须能够处理 IAdviseSink(如果容器提供了一个);容器可能不会,在这种情况下,控件当然要确保它不会尝试调用不存在的接收器。 |
IOleInPlaceObject |
表示控件的就地激活和可能的 UI 激活能力。 此接口意味着控件具有某种可以激活的用户接口,并且还支持 IOleInPlaceActiveObject。 所需的方法为 GetWindow、InPlaceDeactivate、UIDeactivate、SetObjectRects 和 ReactivateAndUndo。 支持此接口需要支持 IOleObject。 |
IOleInPlaceActiveObject |
支持 IOleInPlaceObject 的本地对象也必须提供此接口,但控件本身不一定直接实现接口。 |
IOleControl |
表示控件处理 (a) 助记符(GetControlInfo、OnMnemonic 方法)、(b) 环境属性 (OnAmbientPropertyChange) 和/或 (c) 控件要求容器处理的事件 (FreezeEvents) 的能力和愿望。 请注意,助记符不同于通过 IOleInPlaceActiveObject 处理的加速器:助记符具有关联的 UI,即使控件 UI 不处于活动状态,助记符也处于活动状态。 控件对助记符的支持意味着该控件还知道如何使用容器的 IOleControlSite::OnControlInfoChanged 方法。 由于这要求控件知道容器的站点,因此对助记符的支持也意味着对 IOleObject 的支持。 此外,掌握助记符需要就地支持,因此 IOleInPlaceObject。 如果控件使用任何容器环境属性,那么它还必须实现此接口来接收更改通知,因为需要遵循更改的语义。 由于环境属性只能通过容器站点的 IDispatch 获得,因此环境属性支持意味着控件支持IOleObject(获取站点),并且能够生成 IDispatch::Invoke 调用。 在容器不处理事件时必须知道的控件必须使用 FreezeEvents 方法,这是控制知道此条件的唯一方法。 如果 FreezeEvents 仅在隔离中是必需的,以便不实现其他 IOleControl 方法,则 IOleControl 可以在没有 IOleObject 或 IOleInPlaceObject 的情况下独立运行。 |
IDataObject |
指示控件至少可以提供 (a) 控件的图形呈现(如果控件具有任何视觉效果,则 CF_METAFILEPICT 为最小值)和/或 (b) 属性集(如果控件要提供任何属性)。 需要方法 GetData、QueryGetData、EnumFormatEtc、DAdvise、DUnadvise 和 EnumDAdvise。 支持 CF_METAFILEPICT 以外的图形格式是可选的。 |
IViewObject2 |
指示控件在未处于活动状态时具有一些有趣的视觉效果。 如果实现,控件必须支持方法 Draw、GetAdvise、SetAdvise 和 GetExtent。 |
IDispatch |
指示控件具有 (a) 自定义方法或 (b) 自定义属性,这些方法和属性都可通过 IDispatch::Invoke 的后期绑定获得。 这还需要控件通过其他 IDispatch 方法提供类型信息。 一个控件可以支持多个 IDispatch 实现,其中只有一个与 IID_IDispatch 关联,其他控件必须具有自己唯一的 dispinterface 标识符。 鼓励控件为自定义方法和属性访问提供双重接口,但如果存在方法和属性,则这是可选的。 |
IConnectionPointContainer |
指示控件至少支持一个传出接口,如事件或属性更改通知。 如果此接口完全可用,则必须实现此接口的所有方法,包括 EnumConnectionPoints,该方法需要一个具有 IEnumConnectionPoints 的单独对象。 对 IConnectionPointContainer 的支持意味着该对象还支持一个或多个具有 IConnectionPoint 的相关对象,这些对象可以通过 IConnectionPointContainer 方法获得。 每个连接点对象本身都必须实现完整的 IConnectionPoint 接口,包括 EnumConnections,这需要另一个具有 IEnumConnections 接口的枚举器对象。 |
IProvideClassInfo IProvideClassInfo2 |
指示对象可以直接通过 IProvideClassInfo::GetClassInfo 提供其自己的 coclass 类型信息。 如果控件支持后面的变体 IProvideClassInfo2,则它还指示其通过 IProvideClassInfo2::GetGUID 提供其主源 IID 的能力。 这个接口的所有方法都必须实现。 |
ISpecifyPropertyPages |
指示控件具有可以显示的属性页,以便在为多控件选择显示属性页时,容器可以将此控件的属性页与其他控件的页进行协调。 当支持存在时,必须实现此接口的所有方法。 |
IPerPropertyBrowsing |
指示控件的能力:(a) 为属性提供显示字符串,(b) 为其属性提供预定义的字符串和值,和/或 (c) 将属性 dispID 映射到特定的属性页。 对该接口的支持意味着通过如上所述的 IDispatch 提供对属性的支持。 如果支持 (c),那么这也意味着通过 IPerPropertyBrowsing::MapPropertyToPage 映射的对象的属性页本身实现IPropertyPage2,而不是基本的 IPropertyPage 接口。 |
IPersistStream IPersistStreamInit IPersistMemory IPersistStorage IPersistMoniker IPersistPropertyBag |
请参阅持久接口。 |
IOleCache IOleCache2 |
表示支持控件视觉效果的容器缓存。 控件通常通过 OLE 函数 CreateDataCache 获取缓存支持。 只有具有有意义的静态内容的控件才应选择执行此操作(尽管这不是必需的)。 如果控件完全支持缓存,它应只聚合数据缓存,并从数据缓存公开 IOleCache 和 IOleCache2 接口。 实现 IOleObject 的控件必须能够处理 IAdviseSink(如果容器提供了一个);容器可能不会,在这种情况下,控件当然要确保它不会尝试调用不存在的接收器。 |
IExternalConnection |
指示控件支持与自身的外部链接;也就是说,控件未标记为 OLEMISC_CANTLINKINSIDE,并支持 IOleObject::SetMoniker 和 IOleObject::GetMoniker。 容器永远不会查询此接口本身,也不会直接调用它,因为调用是从 OLE 的远程处理层内部生成的。 |
IRunnableObject |
指示控件与某些进程内对象一样,区分正在加载和正在运行的控件。 |