Articulo de referencia

Vinculación e incrustación de objetos

La vinculación e incrustación de objetos ( OLE ) es una tecnología propietaria desarrollada por Microsoft que permite incrustar y vincular documentos y otros objetos . Para los ...

La vinculación e incrustación de objetos ( OLE ) es una tecnología propietaria desarrollada por Microsoft que permite incrustar y vincular documentos y otros objetos . Para los desarrolladores, supuso la introducción de la extensión de control OLE (OCX), una forma de desarrollar y utilizar elementos de interfaz de usuario personalizados. A nivel técnico, un objeto OLE es cualquier objeto que implementa la IOleObjectinterfaz, posiblemente junto con una amplia gama de otras interfaces, según las necesidades del objeto.

Descripción general

OLE permite que una aplicación de edición exporte parte de un documento a otra aplicación de edición y luego lo importe con contenido adicional. Por ejemplo, un sistema de autoedición podría enviar texto a un procesador de textos o una imagen a un editor de imágenes mediante OLE. [ 1 ] La principal ventaja de OLE es agregar diferentes tipos de datos a un documento desde distintas aplicaciones, como un editor de texto y un editor de imágenes. Esto crea un documento en formato binario de archivo compuesto (FSB) y un archivo maestro al que el documento hace referencia. Los cambios en los datos del archivo maestro afectan inmediatamente al documento que lo referencia. Esto se denomina "vinculación" (en lugar de "incrustación").

OLE también se puede utilizar para transferir datos entre diferentes aplicaciones mediante la función de arrastrar y soltar o el uso del portapapeles .

Historia

OLE 1.0

OLE 1.0, lanzado en 1990, fue una evolución del concepto original de Intercambio Dinámico de Datos (DDE) que Microsoft desarrolló para versiones anteriores de Windows . Mientras que DDE se limitaba a transferir cantidades limitadas de datos entre dos aplicaciones en ejecución, OLE era capaz de mantener vínculos activos entre dos documentos o incluso incrustar un tipo de documento dentro de otro.

Los servidores y clientes OLE se comunican con las bibliotecas del sistema mediante tablas de funciones virtuales (VTBL). La VTBL consiste en una estructura de punteros a funciones que la biblioteca del sistema puede usar para comunicarse con el servidor o el cliente. Las bibliotecas del servidor y del cliente, OLESVR.DLL y OLECLI.DLL , se diseñaron originalmente para comunicarse entre sí mediante el mensaje WM_DDE_EXECUTE .

OLE 1.0 evolucionó posteriormente hasta convertirse en una arquitectura para componentes de software conocida como Component Object Model (COM), y más tarde DCOM .

Cuando un objeto OLE se copia al portapapeles o se inserta en un documento, se almacena tanto una representación visual en formatos nativos de Windows (como un mapa de bits o un metarchivo ) como los datos subyacentes en su propio formato. Esto permite que las aplicaciones muestren el objeto sin necesidad de cargar la aplicación que lo creó, y también permite editarlo si la aplicación correspondiente está instalada.

El Object Packager , un componente de OLE presente desde Windows 3.1 hasta Windows XP, permite "empaquetar" un objeto que no es OLE para que pueda integrarse en un cliente OLE.

OLE 2.0

OLE 2.0 fue la siguiente evolución de OLE, compartiendo muchos de los mismos objetivos que la versión 1.0, pero se reimplementó sobre COM en lugar de usar VTBL directamente. Las nuevas características fueron la automatización de OLE , arrastrar y soltar , activación in situ y almacenamiento estructurado . Los Monikers evolucionaron a partir de los nombres de objetos de OLE 1 y proporcionaron un sistema jerárquico de nombres de objetos y recursos similar a las URL o URI , que se inventaron de forma independiente. Windows ahora ha fusionado las dos tecnologías, admitiendo un tipo de Moniker de URL y un esquema de URL de Moniker. OLE 2.0 introdujo UUID para etiquetar objetos de API. [ 2 ]

Controles personalizados OLE

Los controles personalizados OLE se introdujeron en 1994 como reemplazo de los controles de extensión de Visual Basic, ahora obsoletos. En lugar de actualizarlos, la nueva arquitectura se basó en OLE. En particular, cualquier contenedor que admitiera OLE 2.0 ya podía incorporar controles personalizados OLE, aunque estos controles no pueden reaccionar a eventos a menos que el contenedor lo admita. Los controles personalizados OLE generalmente se distribuyen como una biblioteca de vínculos dinámicos con la extensión .ocx. En 1996, todas las interfaces para controles (excepto IUnknown) se hicieron opcionales para reducir el tamaño de los archivos de controles y así acelerar su descarga; estos se denominaron entonces controles ActiveX .

Detalles técnicos

Los objetos y contenedores OLE se implementan sobre el Modelo de Objetos Componentes (COM ); son objetos que pueden implementar interfaces para exportar su funcionalidad. Solo la interfaz IOleObject es obligatoria, pero puede ser necesario implementar otras interfaces si se requiere la funcionalidad que estas exportan.

Para facilitar la comprensión de lo que sigue, es necesario explicar algunos términos. El estado de visualización de un objeto indica si es transparente, opaco o opaco con fondo sólido, y si admite el dibujo con una relación de aspecto específica. El lugar de un objeto es un objeto que representa su ubicación dentro de su contenedor. Un contenedor admite un objeto de lugar para cada objeto que contiene.

A continuación se presenta una lista de interfaces, agrupadas según el objeto que normalmente necesita implementarlas. Las interfaces que suele implementar el objeto OLE suelen ser llamadas por el contenedor OLE, y viceversa. Tenga en cuenta que en la siguiente lista la indentación indica la herencia de la interfaz. Todas las interfaces sin indentación derivan de IUnknown .

objeto OLE

Objeto de datos
Una vez implementada, permite la transferencia de datos y la notificación de cambios en los mismos. Debe ser implementada por objetos que admitan la función de arrastrar y soltar, copiar o pegar desde el portapapeles, o vincularse o incrustarse en un documento contenedor.
ObjetoConSitio
Permite al llamador informar al objeto OLE sobre su ubicación. Esta funcionalidad también la proporciona OleObject , pero se puede usar ObjectWithSite , cuando sea compatible, si OleObject no se usa para otros fines.
OleCache
Permite almacenar en caché las representaciones visuales de un DataObject . Esto permite que un objeto incrustado guarde su representación visual, lo que posibilita su visualización posterior sin necesidad de iniciar la aplicación que se utilizó para crear el objeto.
Normalmente se utiliza la implementación estándar.
OleCache2
Proporciona un control más preciso sobre el almacenamiento en caché.
Normalmente se utiliza la implementación estándar.
Control de caché Ole
Esta interfaz no es llamada por el contenedor, sino internamente por el objeto para permitirle recibir notificaciones sobre cuándo se está ejecutando su DataObject , lo que le permite suscribirse a las notificaciones de cambios de datos de ese objeto y, por lo tanto, actualizar correctamente la presentación almacenada en caché.
Normalmente se utiliza la implementación estándar.
Documento Ole
Permite que el objeto OLE admita múltiples vistas de sus datos, así como algunas funciones relacionadas.
Vista de documentos Ole
Un objeto de documento (un objeto que implementa OleDocument ) implementa esta interfaz para cada vista. Permite al usuario establecer la ubicación del objeto, consultar y definir su tamaño, así como mostrarlo y activarlo, además de otras funciones relacionadas.
Ventana Ole
Objeto activo en lugar de Ole
Llamada por el contenedor más externo de un objeto para interactuar con él mientras está activo, por ejemplo, para procesar las claves de acceso rápido en la cola de mensajes del contenedor que están destinadas al objeto contenido.
Objeto OleInPlace
Llamada por el contenedor para activar o desactivar el objeto.
IOleInPlaceObjectWindowless
Un objeto sin ventana es aquel que no tiene su propia ventana, sino que se muestra en la ventana de su contenedor. El contenedor lo utiliza para reenviar los mensajes recibidos por su ventana, destinados al objeto contenido. Por ejemplo, si se mueve el ratón sobre una ventana, Windows coloca un mensaje de movimiento del ratón junto con las coordenadas del ratón en la cola de mensajes de la ventana. Si esta ventana contiene objetos incrustados sin ventana, es posible que el mensaje deba reenviarse a dicho objeto si las coordenadas del puntero del ratón se encuentran sobre él. Por razones similares, esta interfaz también proporciona acceso a la interfaz DropTarget del objeto .
Enlace Ole
Permite que el objeto admita la vinculación, por ejemplo, permitiendo que el contenedor establezca el origen de un objeto vinculado.
Normalmente se utiliza la implementación estándar.
Objeto Ole
Podría decirse que es la interfaz más importante para un objeto OLE. Por ejemplo, permite que el contenedor informe al objeto sobre su ubicación, lo inicialice a partir de datos, lo abra y lo cierre, consulte y establezca su tamaño, solicite notificaciones en el AdviseSink del contenedor y ejecute acciones definidas como "verbos" en el objeto. Estos verbos suelen incluir "Abrir" o "Editar", pero también pueden incluir otros. Uno de los verbos se define como el verbo principal y se ejecuta cuando el usuario hace doble clic en un objeto.
ViewObject
Permite que un objeto se dibuje a sí mismo directamente, sin pasar un DataObject al contenedor. Para los objetos que admiten tanto DataObject como esta interfaz, la implementación subyacente suele ser compartida.
VerObjeto2
Además, permite al usuario consultar el tamaño del objeto.
ViewObjectEx
Añade compatibilidad para dibujar objetos transparentes sin parpadeos, realizar pruebas de detección de colisiones para objetos con formas irregulares y establecer el tamaño de un objeto.

contenedor OLE

IAdviseSink
Permite al implementador recibir notificaciones cuando el objeto se guarda, se cierra o se renombra, o cuando cambian sus datos o su presentación visual.
IAdviseSink2
Además, permite al implementador recibir notificaciones cuando cambia el origen del enlace del objeto OLE.
IAdviseSinkEx
Además, permite al implementador recibir notificaciones cuando cambia el estado de visualización del objeto OLE.
Sitio cliente de IOle
Esta interfaz permite al usuario obtener información sobre el contenedor y la ubicación de un objeto, así como solicitar que el objeto se guarde, se redimensione, se muestre, se oculte, etcétera.
Sitio de documentos de IOle
Permite al usuario solicitar la activación inmediata del objeto en este sitio. Si se implementa esta interfaz, también deben implementarse IOleClientSite , IOleInPlaceSite e IAdviseSink .
Contenedor de E/S
Esta interfaz permite al usuario enumerar los objetos incrustados en un contenedor o encontrarlos por su nombre. Resulta especialmente útil si el contenedor desea admitir enlaces a objetos incrustados.
Ventana IOleWindow
Ventana de interfaz de usuario de IOleInPlace
Permite que los objetos incrustados negocien el espacio para las barras de herramientas en la ventana del contenedor.
Marco IOleInPlace
Permite al usuario solicitar al contenedor que inserte sus elementos de menú en un menú vacío que se convertirá en el menú cooperativo. También permite al usuario solicitar al contenedor que muestre u oculte este menú, que muestre u oculte cuadros de diálogo y que procese las teclas de acceso rápido recibidas por el objeto contenido destinado al contenedor.
Sitio IOleInPlace
Si un contenedor implementa esta interfaz, permite que los objetos incrustados se activen en el mismo lugar, es decir, sin abrirlos en una ventana separada. Proporciona acceso a la interfaz IOleInPlaceUIWindow del contenedor .
IOleInPlaceSiteEx
Si un contenedor implementa esta interfaz, permite que los objetos incrustados comprueben si necesitan redibujarse al activarse o desactivarse. También les permite solicitar que se active su interfaz de usuario.
IOleInPlaceSiteWindowless
Si un contenedor desea admitir objetos incrustados sin ventana, debe proporcionarles funcionalidades que reemplacen las que normalmente ofrece la ventana del objeto incrustado. Por ejemplo, esta interfaz permite acceder al contexto del dispositivo de la ventana del contenedor, lo que posibilita que el objeto incrustado dibuje en ella.
IOleUILinkContainer
Contiene los métodos que utilizan los cuadros de diálogo OLE estándar para administrar objetos vinculados, con el fin de actualizar dichos objetos en un contenedor o consultar y modificar sus orígenes. Se utiliza en los cuadros de diálogo "Vínculos", "Cambiar origen", "Actualizar vínculos" y "Propiedades del objeto".
Información de enlace de interfaz de usuario de IOle
Además, permite que los cuadros de diálogo consulten cuándo se actualizaron por última vez los objetos vinculados y si esto se hizo de forma automática o manual.
Información del objeto IOleUI
Contiene los métodos necesarios para el cuadro de diálogo "Propiedades del objeto". Por ejemplo, si el usuario abre el cuadro de diálogo "Propiedades del objeto" y solicita que el objeto se convierta a otro tipo, se llama a un método de esta interfaz.
Administrador de deshacer de E/S
Proporciona un servicio de deshacer centralizado tanto para el propio contenedor como para los objetos incrustados. Cuando se realiza una acción que se puede deshacer, se crea una IOleUndoUnit y se agrega al IOleUndoManager.

Otro

Titular del asesoramiento de datos
Los métodos de IDataObject relacionados con las notificaciones de cambios de datos se pueden implementar llamando a los métodos de esta interfaz.
Normalmente se utiliza la implementación estándar.
Titular del asesoramiento de IOle
Los métodos de IOleObject relacionados con las notificaciones se pueden implementar llamando a los métodos de esta interfaz.
Normalmente se utiliza la implementación estándar.
IDropSource
Se implementa en objetos que se pueden arrastrar, es decir, que pueden ser el origen de operaciones de arrastrar y soltar. Al implementarse, permite que el objeto dibuje efectos de arrastrar y soltar, y que especifique cuándo se suelta el objeto o se cancela la operación.
IDropTarget
Implementada por objetos que aceptan objetos arrastrados y soltados, es decir, que pueden ser el destino de operaciones de arrastrar y soltar. Cuando se implementa, permite que el objeto de destino especifique si se aceptará un objeto arrastrado y qué sucede con él después de soltarlo.
Objetivo de comando de E/S
Puede ser implementado por objetos (objetos OLE, contenedores OLE y otros objetos) que deseen admitir ciertos comandos estándar. Permite a quienes lo invocan consultar si los comandos son compatibles y ejecutarlos. Algunos comandos que un objeto suele querer implementar incluyen "eliminar", "cortar", "copiar", "pegar", "deshacer", "buscar", "imprimir", "guardar", "hacer zoom", etc. Actualmente se han definido 58 comandos estándar, que incluyen comandos de uso común en software de oficina, navegadores web y aplicaciones similares.
Unidad de deshacer de IOle
Representa una acción que se puede deshacer. Contiene toda la información necesaria para deshacer una acción. Es creada por objetos y contenedores, de modo que las acciones deshabilitables se pueden agregar al IOleUndoManager del contenedor .
Unidad de deshacer del padre de E/S
Permite que una unidad de deshacer contenga otras unidades de deshacer. En esencia, esto permite que la unidad de deshacer funcione como una pila de deshacer, agrupando unidades de deshacer. Por ejemplo, si se ejecuta una macro, todas las acciones que esta realiza y que se pueden deshacer pueden agruparse en una sola unidad de deshacer.
Ventana IOleWindow
Esta interfaz representa una ventana de un contenedor u objeto contenido. Permite a los usuarios obtener el identificador de la ventana y activar o desactivar la función de ayuda contextual. Cuando se activa la ayuda contextual, el puntero del ratón suele cambiar a una flecha con un signo de interrogación para indicar que al hacer clic en un elemento de la interfaz se abrirá una ventana de ayuda.

Competencia

La tecnología OpenDoc intentó competir con OLE. Algunos competidores de Microsoft consideraban que OpenDoc era más robusta y fácil de usar. OpenDoc permitía a los usuarios visualizar y editar información en diferentes aplicaciones, compitiendo directamente con el estándar OLE propietario de Microsoft. En 1993, algunos competidores de Microsoft crearon un consorcio llamado Component Integration Laboratories (CIL) para desarrollar OpenDoc como un estándar abierto para la vinculación e integración multiplataforma.

Microsoft exigió la compatibilidad con OLE como condición para certificar la compatibilidad de una aplicación con Windows 95. Inicialmente, Microsoft anunció que las aplicaciones que usaran OpenDoc se considerarían compatibles con OLE y recibirían la certificación para Windows 95. Posteriormente, Microsoft revirtió la decisión y declaró que las aplicaciones que usaran OpenDoc podrían no recibir ninguna certificación. Microsoft retuvo las especificaciones y las versiones depuradas de OLE hasta después de haber lanzado sus aplicaciones competidoras.

Interoperabilidad

El uso de objetos OLE limita la interoperabilidad, ya que estos objetos no son ampliamente compatibles con programas para visualizar o editar archivos fuera de Microsoft Windows (por ejemplo, la incrustación de otros archivos dentro del archivo, como tablas o gráficos de una aplicación de hoja de cálculo en un documento de texto o archivo de presentación). [ 3 ] [ 4 ] [ 5 ] [ 6 ] Si no se dispone de software que entienda un objeto OLE, este suele ser reemplazado por una imagen (representación de mapa de bits del objeto) o simplemente no se muestra. [ 7 ] [ 8 ] [ 9 ]

Véase también

Referencias

  1. Este artículo se basa en material tomado de Object+Linking+and+Embedding en el Free On-line Dictionary of Computing antes del 1 de noviembre de 2008 e incorporado bajo los términos de "relicencia" de la GFDL , versión 1.3 o posterior.
  2. Windows avanzado (Guía para desarrolladores de la API Win32 para Windows NT 3.5 y Windows 95)
  3. Byfield, Bruce (23 de agosto de 2005). "Comparativa de procesadores de texto FOSS: OOo Writer, AbiWord y KWord" . Linux.com . The Linux Foundation. Archivado del original el 6 de noviembre de 2020. Consultado el 29 de septiembre de 2020 .
  4. Byfield, Bruce (28 de julio de 2005). "Compartir archivos entre OpenOffice.org y Microsoft Office" . Linux.com . The Linux Foundation. Archivado del original el 6 de noviembre de 2020. Consultado el 29 de septiembre de 2020 .
  5. Sharma, Mayank (2008-11-20). "SoftMaker Office 2008 se centra en la compatibilidad con Microsoft Office" . Linux.com . The Linux Foundation. Archivado del original el 6 de noviembre de 2020. Consultado el 29 de septiembre de 2020 .
  6. Lagadec, Philippe (30 de noviembre de 2006). "Seguridad de OpenOffice / OpenDocument y Microsoft Office 2007 / Open XML" (PDF) . Conferencia PacSec 2006. Archivado ( PDF) del original el 22 de julio de 2011. Consultado el 29 de septiembre de 2020 .
  7. Gong, Rhett (5 de septiembre de 2005). "RE: ¿Representación de objeto OLE en mapa de bits?" . Grupo de noticias : microsoft.public.win32.programmer.ole . Usenet: iZFkEiesFHA.1204@TK2MSFTNGXA01.phx.gbl . Consultado el 29 de septiembre de 2020 .  
  8. O'Neill, Mike (09/02/2005). "Un control de edición enriquecido que muestra mapas de bits y otros objetos OLE" . Code Project . Archivado del original el 31/12/2011 . Consultado el 29/09/2020 .
  9. "ACC: Por qué los objetos OLE provocan el crecimiento de las bases de datos" . Microsoft . 19 de enero de 2007. Archivado del original el 15 de febrero de 2008.
  • ripOLE : extrae archivos adjuntos de documentos OLE.
  • Información general sobre OLE de docs.microsoft.com