¿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. |