¿Qué significa la compatibilidad con una interfaz?

Además de la interfaz IUnknown , un control ActiveX o un objeto COM para ese asunto expresa la funcionalidad opcional que admite a través de interfaces adicionales. Esto es decir que no se requiere ninguna otra interfaz por encima de IUnknown. Para ello, en la tabla siguiente se enumeran las interfaces que puede admitir un control ActiveX y lo que significa admitir esa interfaz.

Interfaz Comentarios/qué significa admitir la interfaz
IOleObject
Si el control requiere comunicación con su sitio de cliente para algo distinto de los eventos (vea IConnectionPointContainer), IOleObject es una necesidad. Al implementar esta interfaz, el control también debe admitir la semántica de los métodos siguientes: SetHostNames, Close, EnumVerbs, Update, IsUpToDate, GetUserClassID, GetUserType, GetMiscStatus y los métodos Advise, Unadvise y EnumAdvise que funcionan junto con la implementación de IAdviseSink de un contenedor. Un control que implemente IOleObject debe ser capaz de controlar IAdviseSink si el contenedor proporciona uno; Es posible que un contenedor no, en cuyo caso un control garantice, por supuesto, que no intente llamar a un receptor inexistente.
IOleInPlaceObject
Expresa la capacidad del control para activarse en contexto y, posiblemente, activar la interfaz de usuario. Esta interfaz significa que el control tiene una interfaz de usuario de algún tipo que se puede activar y también se admite IOleInPlaceActiveObject . Los métodos necesarios son GetWindow, InPlaceDeactivate, UIDeactivate, SetObjectRects y ReactivateAndUndo. La compatibilidad con esta interfaz requiere compatibilidad con IOleObject.
IOleInPlaceActiveObject
Un objeto compatible en contexto que admita IOleInPlaceObject también debe proporcionar esta interfaz, aunque el propio control no implementa necesariamente la interfaz directamente.
IOleControl
Expresa la capacidad y el deseo del control de tratar (a) los eventos mnemonics (GetControlInfo, OnMnemonic ), (b) propiedades ambientales (OnAmbientPropertyChange) y/o (c) que el control requiere que el contenedor controle (FreezeEvents). Tenga en cuenta que los mnemonics son diferentes de los aceleradores que se controlan a través de IOleInPlaceActiveObject: los mnemonics tienen interfaz de usuario asociada y están activos incluso cuando el control no está activo en la interfaz de usuario. La compatibilidad de un control con mnemonics significa que el control también sabe cómo usar el método IOleControlSite::OnControlInfoChanged del contenedor. Dado que esto requiere que el control conozca el sitio del contenedor, la compatibilidad con mnemonics también significa compatibilidad con IOleObject. Además, el conocimiento de los mnemonics requiere compatibilidad local y, por tanto, IOleInPlaceObject.
Si un control usa propiedades de ambiente de contenedor, también debe implementar esta interfaz para recibir notificaciones de cambio, ya que se requiere la semántica de los cambios. Dado que las propiedades ambientales solo están disponibles a través de IDispatch del sitio contenedor, la compatibilidad con propiedades ambientales significa que el control admite IOleObject (para obtener el sitio) y también puede generar llamadas IDispatch::Invoke .
El método FreezeEvents es necesario para los controles que deben saber cuándo un contenedor no va a controlar un evento, esta es la única manera de que el control conozca esta condición. Si FreezeEvents solo es necesario de forma aislada, de modo que no se implementen otros métodos IOleControl , IOleControl puede ser independiente sin IOleObject o IOleInPlaceObject.
IDataObject
Indica que el control puede proporcionar al menos (a) representaciones gráficas del control (CF_METAFILEPICT es el mínimo si el control tiene objetos visuales en absoluto) o (b) conjuntos de propiedades, si el control tiene propiedades que proporcionar. Se requieren los métodos GetData, QueryGetData, EnumFormatEtc, DAdvise, DUnadvise y EnumDAdvise . La compatibilidad con formatos gráficos distintos de CF_METAFILEPICT es opcional.
IViewObject2
Indica que el control tiene algunos objetos visuales interesantes cuando no está activo en contexto. Si se implementa, un control debe admitir los métodos Draw, GetAdvise, SetAdvise y GetExtent.
IDispatch
Indica que el control tiene (a) métodos personalizados o (b) propiedades personalizadas que están disponibles a través del enlace en tiempo de ejecución a través de IDispatch::Invoke. Esto también requiere que el control proporcione información de tipos a través de otros métodos IDispatch . Un control puede admitir varias implementaciones de IDispatch en las que solo una está asociada a IID_IDispatch las demás deben tener sus propios identificadores dispinterface únicos.
Se recomienda un control proporcionar interfaces duales para el acceso a métodos y propiedades personalizados, pero esto es opcional si existen métodos y propiedades.
IConnectionPointContainer
Indica que un control admite al menos una interfaz saliente, como eventos o notificaciones de cambio de propiedades. Todos los métodos de esta interfaz deben implementarse si esta interfaz está disponible en absoluto, incluidos EnumConnectionPoints , que requiere un objeto independiente con IEnumConnectionPoints.
La compatibilidad con IConnectionPointContainer significa que el objeto también admite uno o varios objetos relacionados con IConnectionPoint que están disponibles a través de métodos IConnectionPointContainer . Cada objeto de punto de conexión debe implementar la interfaz IConnectionPoint completa, incluida EnumConnections, que requiere otro objeto enumerador con la interfaz IEnumConnections .
IProvideClassInfo
IProvideClassInfo2
Indica que el objeto puede proporcionar su propia información de tipo de coclase directamente a través de IProvideClassInfo::GetClassInfo. Si el control admite la variación posterior IProvideClassInfo2, también indica su capacidad de proporcionar su IID de origen principal a través de IProvideClassInfo2::GetGUID. Todos los métodos de esta interfaz deben implementarse.
ISpecifyPropertyPages
Indica que el control tiene páginas de propiedades que puede mostrar para que un contenedor pueda coordinar las páginas de propiedades de este control con las páginas de otros controles cuando se muestran las páginas de propiedades para una selección de varios controles. Todos los métodos de esta interfaz deben implementarse cuando exista compatibilidad.
IPerPropertyBrowsing
Indica la capacidad del control para (a) proporcionar una cadena para mostrar para una propiedad, (b) proporcionar cadenas y valores predefinidos para sus propiedades y/o (c) asignar un dispID de propiedad a una página de propiedades específica. La compatibilidad con esta interfaz significa que se proporciona compatibilidad con propiedades a través de IDispatch como se ha indicado anteriormente. Si se admite (c), también significa que las páginas de propiedades del objeto asignadas a través de IPerPropertyBrowsing::MapPropertyToPage implementan IPropertyPage2 en lugar de la interfaz IPropertyPage básica.
Ipersiststream
IPersistStreamInit
IPersistMemory
IPersistStorage
IPersistMoniker
IPersistPropertyBag
Consulte Interfaces de persistencia.
IOleCache
IOleCache2
Indica compatibilidad con el almacenamiento en caché de contenedores de objetos visuales de control. Un control generalmente obtiene compatibilidad con el almacenamiento en caché a través de la función OLE CreateDataCache. Solo los controles con contenido estático significativo deben elegir hacerlo (aunque no es necesario). Si un control admite el almacenamiento en caché en absoluto, simplemente debe agregar la caché de datos y exponer las interfaces IOleCache e IOleCache2 de la caché de datos. Un control que implemente IOleObject debe ser capaz de controlar IAdviseSink si el contenedor proporciona uno; Es posible que un contenedor no, en cuyo caso un control garantice, por supuesto, que no intente llamar a un receptor inexistente.
IExternalConnection
Indica que el control admite vínculos externos a sí mismo; es decir, el control no está marcado con OLEMISC_CANTLINKINSIDE y admite IOleObject::SetMoniker e IOleObject::GetMoniker. Un contenedor nunca consultará esta interfaz ni lo llamará directamente a medida que se generan llamadas desde la capa de comunicación remota de OLE.
IRunnableObject
Indica que el control diferencia que se carga de la ejecución, como hacen algunos objetos en proceso.

Controles