Qué significa la compatibilidad con una interfaz

Además de la interfaz IUnknown, un control ActiveX o un objeto COM expresan cualquier funcionalidad opcional que admita a través de interfaces adicionales. Es decir, no se requieren otras interfaces por encima de IUnknown. Para ello, en la tabla siguiente se enumeran las interfaces que un control ActiveX Control podría admitir y lo que significa admitir esa interfaz.

Interfaz Comentarios/Qué significa admitir la interfaz
IOleObject
Si el control requiere comunicación con su sitio cliente para cualquier cosa que no sea 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, GetMiscStatusy los métodos Advise, Unadvisey EnumAdvise que funcionan junto con la implementación de IAdviseSink de un contenedor. Un control que implementa IOleObject debe ser capaz de controlar IAdviseSink si el contenedor proporciona uno; Un contenedor no puede, en cuyo caso, un control garantiza, por supuesto, que no intenta llamar a un receptor inexistente.
IOleInPlaceObject
Expresa la capacidad del control para activarse en su lugar 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, SetObjectRectsy ReactivateAndUndo. La compatibilidad con esta interfaz requiere compatibilidad con IOleObject.
IOleInPlaceActiveObject
Un objeto compatible en el lugar 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 con (a) mnemonics (Métodos GetControlInfo, OnMnemonic), (b) propiedades ambientales (OnAmbientPropertyChange)o (c) eventos que el control requiere que el contenedor controle (FreezeEvents). Tenga en cuenta que las teclas mnemotécnicas son diferentes de los aceleradores que se controlan a través de IOleInPlaceActiveObject:los elementos mnemotécnicos tienen asociada la interfaz de usuario 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 mnemonics requiere compatibilidad local y, por tanto, IOleInPlaceObject.
Si un control usa cualquier propiedad contenedor-ambiente, también debe implementar esta interfaz para recibir notificaciones de cambio, ya que se requiere seguir la semántica de los cambios. Dado que las propiedades de ambiente solo están disponibles a través de IDispatch del sitio de contenedor, la compatibilidad con la propiedad ambient significa que el control admite IOleObject (para obtener el sitio), así como la capacidad de 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, DUnadvisey 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 su lugar. Si se implementa, un control debe admitir los métodos Draw, GetAdvise, SetAdvisey 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 entrega a través de IDispatch::Invoke. Esto también requiere que el control proporciona información de tipos a través de otros métodos IDispatch. Un control puede admitir varias implementaciones de IDispatch, donde solo una está asociada a IID IDispatch y las demás deben tener sus propios identificadores _ dispinterface únicos.
Se recomienda que un control proporcione interfaces duales para el acceso a propiedades y métodos 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 propiedad. Todos los métodos de esta interfaz deben implementarse si esta interfaz está disponible, 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 los 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 para proporcionar su IID de origen principal a través de IProvideClassInfo2::GetGUID. Se deben implementar todos los métodos de esta interfaz.
ISpecifyPropertyPages
Indica que el control tiene páginas de propiedades que puede mostrar de forma que un contenedor pueda coordinar las páginas de propiedades de este control con las páginas de otro control cuando se muestren 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 de presentación para una propiedad, (b) proporcionar cadenas y valores predefinidos para sus propiedades 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 las 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
Vea Persistence Interfaces ( Interfaces de persistencia).
IOleCache
IOleCache2
Indica la compatibilidad con el almacenamiento en caché de contenedores de objetos visuales de control. Por lo general, un control 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é, simplemente debe agregar la caché de datos y exponer las interfaces IOleCache e IOleCache2 de la caché de datos. Un control que implementa IOleObject debe ser capaz de controlar IAdviseSink si el contenedor proporciona uno; Un contenedor no puede, en cuyo caso, un control garantiza, por supuesto, que no intenta 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 la llamará directamente a medida que se generen llamadas desde dentro de la capa de comunicación remota de OLE.
IRunnableObject
Indica que el control diferencia la carga de la ejecución, como hacen algunos objetos en proceso.

Controles