Tecnología desarrollada por Microsoft
Object Linking and Embedding ( OLE ) es una tecnología propia desarrollada por Microsoft que permite la incrustación y vinculación de documentos y otros objetos. Para los desarrolladores, trajo consigo OLE Control Extension (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 IOleObject
interfaz, 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 un texto a un procesador de texto o una imagen a un editor de mapas de bits mediante OLE. [1] El principal beneficio de OLE es agregar diferentes tipos de datos a un documento desde diferentes aplicaciones, como un editor de texto y un editor de imágenes. Esto crea un documento de formato binario de archivo compuesto 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 llama "vinculación" (en lugar de "incrustación").
OLE también se puede utilizar para transferir datos entre diferentes aplicaciones mediante operaciones de arrastrar y soltar o 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 o VTBL. Las VTBL consisten en una estructura de punteros de función que la biblioteca del sistema puede utilizar para comunicarse con el servidor o el cliente. Las bibliotecas de servidor y cliente, OLESVR.DLL y OLECLI.DLL , se diseñaron originalmente para comunicarse entre sí mediante el mensaje WM_DDE_EXECUTE .
OLE 1.0 posteriormente evolucionó para convertirse en una arquitectura para componentes de software conocida como Modelo de objetos componentes (COM), y más tarde DCOM .
Cuando se coloca un objeto OLE en el portapapeles o se incrusta 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 cargar la aplicación utilizada para crearlo, al mismo tiempo que permite editar el objeto, si está instalada la aplicación adecuada.
Object Packager , un componente de OLE disponible desde Windows 3.1 hasta Windows XP, permite "empaquetar" un objeto que no sea 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 volvió a implementar sobre COM en lugar de usar VTBL directamente. Las nuevas características fueron la automatización OLE , la función de arrastrar y soltar , la activación en el lugar y el almacenamiento estructurado . Los monikers evolucionaron a partir de los nombres de objetos de OLE 1 y proporcionaron un sistema de nombres de objetos y recursos jerárquico similar a las URL o URI , que se inventaron de forma independiente. Windows ahora ha fusionado las dos tecnologías que admiten un tipo de moniker de URL y un esquema de URL de moniker.
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 envían en forma de una biblioteca de vínculos dinámicos con la extensión .ocx. En 1996, todas las interfaces para los controles (excepto IUnknown) se hicieron opcionales para mantener bajo el tamaño de archivo de los controles, de modo que se descargaran más rápido; estos se denominaron controles ActiveX .
Detalles técnicos
Los objetos y contenedores OLE se implementan sobre el Modelo de objetos componentes ; son objetos que pueden implementar interfaces para exportar su funcionalidad. Solo la interfaz IOleObject es obligatoria, pero también es posible que sea necesario implementar otras interfaces si se requiere la funcionalidad exportada por esas interfaces.
Para facilitar la comprensión de lo que sigue, es necesario explicar algunos términos. El estado de visualización de un objeto es si el objeto es transparente, opaco u opaco con un fondo sólido, y si admite el dibujo con un aspecto específico. El sitio de un objeto es un objeto que representa la ubicación del objeto en su contenedor. Un contenedor admite un objeto de sitio para cada objeto que contiene.
Lo que sigue es una lista de interfaces, agrupadas por el objeto que normalmente necesita implementarlas. Las interfaces que normalmente implementa el objeto OLE suelen ser invocadas por el contenedor OLE, y viceversa. Tenga en cuenta que en la siguiente lista la sangría indica herencia de interfaz. Todas las interfaces sin sangría derivan de IUnknown .
Objeto OLE
- Objeto de datos
- Cuando se implementa, permite la transferencia de datos y la notificación de cambios en los mismos. Debe implementarse mediante objetos que admitan funciones de arrastrar y soltar, copiarse o pegarse desde el portapapeles o vincularse o incrustarse en un documento contenedor.
- Objeto con sitio
- Permite que el autor de la llamada informe al objeto OLE de su sitio. Esta función también la proporciona OleObject , pero se puede utilizar ObjectWithSite , cuando se admita, si OleObject no se utiliza para otros asuntos.
- OleCache
- Permite almacenar en caché las presentaciones visuales de un DataObject . Esto permite que un objeto incrustado almacene su representación visual, lo que permite visualizarlo más tarde sin necesidad de iniciar la aplicación que se utilizó para crear el objeto.
- Generalmente se utiliza la implementación de stock.
- OleCache2
- Proporciona un control más detallado sobre el almacenamiento en caché.
- Generalmente se utiliza la implementación de stock.
- Control de caché Ole
- Esta interfaz no es llamada por el contenedor, sino internamente por el objeto para permitirle recibir notificaciones de cuándo se está ejecutando su DataObject , lo que le permite suscribirse a notificaciones de cambios de datos de ese objeto y así actualizar la presentación en caché correctamente.
- Generalmente se utiliza la implementación de stock.
- OleDocumento
- Permite que el objeto OLE admita múltiples vistas de sus datos, así como algunas funciones relacionadas.
- Vista de documento Ole
- Un objeto de documento (un objeto que implementa OleDocument ) implementa esta interfaz para cada vista. Permite al invocador establecer la ubicación del objeto, consultar y establecer el tamaño del objeto, y mostrarlo y activarlo, así como algunas funciones relacionadas.
- Ventana Ole
- Objeto activo OleInPlace
- Llamado por el contenedor más externo de un objeto para interactuar con él mientras está activo, por ejemplo, para procesar teclas aceleradoras en la cola de mensajes del contenedor que están destinadas al objeto contenido.
- Objeto OleInPlace
- Llamado por el contenedor para activar o desactivar el objeto.
- IOleInPlaceObjectSin ventana
- Un objeto sin ventanas es un objeto que no tiene su propia ventana, sino que se muestra en la ventana de su contenedor. El contenedor lo utiliza para transmitir mensajes recibidos por la ventana del contenedor que están 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 ventanas, es posible que el mensaje deba transmitirse a dicho objeto si las coordenadas del puntero del ratón están sobre este objeto. 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 la fuente de un objeto vinculado.
- Generalmente se utiliza la implementación de stock.
- Objeto Ole
- Se podría decir que es la interfaz más importante para un objeto OLE. Por ejemplo, permite que el contenedor informe al objeto de su sitio, inicialice el objeto a partir de datos, lo abra y lo cierre, consulte y establezca el tamaño del objeto, solicite notificaciones en el AdviseSink del contenedor y ejecute objetos definidos como "verbos" en el objeto. Estos verbos suelen incluir "Abrir" o "Editar", pero también pueden incluir otros verbos. Uno de los verbos se define como el verbo principal y se ejecuta cuando el usuario hace doble clic en un objeto.
- VerObjeto
- 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 llamador consultar el tamaño del objeto.
- VerObjetoEx
- Agrega soporte para dibujo sin parpadeos de objetos transparentes, pruebas de coincidencia para objetos con formas irregulares y configuración del tamaño de un objeto.
Contenedor OLE
- Yo aconsejo el fregadero
- Permite al implementador recibir notificaciones cuando el objeto se guarda, se cierra o se cambia de nombre, o cuando cambian sus datos o su presentación visual.
- Yo aconsejo el fregadero2
- Además, permite al implementador recibir notificaciones cuando cambia el origen del enlace del objeto OLE.
- Yo aconsejo el fregadero
- Además, permite al implementador recibir notificaciones cuando cambia el estado de vista del objeto OLE.
- Sitio de cliente de IOle
- Esta interfaz permite al llamador obtener información sobre el contenedor y la ubicación de un objeto, así como solicitar que el objeto sea guardado, redimensionado, mostrado, oculto, etcétera.
- Sitio de documentos de IOle
- Permite que el autor de la llamada solicite que el objeto de este sitio se active inmediatamente. Si se implementa esta interfaz, también se deben implementar IOleClientSite , IOleInPlaceSite y IAdviseSink .
- Contenedor de IOle
- Esta interfaz permite que el usuario enumere objetos incrustados en un contenedor o busque dichos objetos por nombre. Es útil principalmente si el contenedor desea admitir enlaces a objetos incrustados.
- Ventana de IOle
- Ventana de interfaz de usuario de IOleInPlace
- Permite que los objetos incrustados negocien espacio para las barras de herramientas en la ventana del contenedor.
- Marco de IOleInPlace
- Permite al llamador 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 llamador solicitar al contenedor que muestre u oculte este menú, que muestre u oculte cuadros de diálogo y que procese las teclas de aceleración recibidas por el objeto contenido destinado al contenedor.
- Sitio de IOleInPlace
- Si un contenedor implementa esta interfaz, permite activar objetos incrustados en el lugar, es decir, sin abrirlos en una ventana separada. Proporciona acceso a la ventana IOleInPlaceUIWindow del contenedor .
- IOleInPlaceSiteEx
- Si un contenedor implementa esta interfaz, permite que los objetos integrados comprueben si es necesario volver a dibujarlos al activarse o desactivarse. También les permite solicitar a su interfaz de usuario que se active.
- IOleInPlaceSiteSin ventanas
- Si un contenedor desea admitir objetos incrustados sin ventanas, debe proporcionarles funcionalidad para reemplazar la funcionalidad que normalmente proporciona la ventana de un objeto incrustado. Por ejemplo, esta interfaz proporciona una forma de acceder al contexto del dispositivo de la ventana del contenedor, lo que permite que el objeto incrustado dibuje en la ventana del contenedor.
- Contenedor de enlaces IOleUI
- Contiene los métodos que utilizan los cuadros de diálogo OLE estándar que administran objetos vinculados para actualizar objetos vinculados en un contenedor o para consultar y cambiar sus orígenes. Se utiliza en los cuadros de diálogo "Vínculos", "Cambiar origen", "Actualizar vínculos" y "Propiedades de objeto".
- Información de enlace de IOleUI
- 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 de objeto de 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 invoca un método en esta interfaz.
- Administrador de deshacer operaciones IOle
- Proporciona un servicio de deshacer centralizado tanto para el contenedor como para los objetos integrados. Cuando se realiza una acción que se puede deshacer, se crea una IOleUndoUnit y se agrega a IOleUndoManager
Otro
- Titular de IDataAdvise
- Los métodos de IDataObject que pertenecen a las notificaciones de cambio de datos se pueden implementar llamando a los métodos de esta interfaz.
- Generalmente se utiliza la implementación de stock.
- Titular de IOleAdvise
- Los métodos de IOleObject que pertenecen a las notificaciones se pueden implementar llamando a los métodos de esta interfaz.
- Generalmente se utiliza la implementación de stock.
- Fuente IDrop
- Implementado por objetos que se pueden arrastrar, es decir, que pueden ser el origen de operaciones de arrastrar y soltar. Cuando se implementa, 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 de arrastrar y soltar.
- IDropTarget (objetivo de caída)
- Implementado por objetos que aceptan objetos soltados, es decir, que pueden ser el destino de operaciones de arrastrar y soltar. Cuando se implementa, permite que el destino especifique si se aceptará un objeto soltado y qué sucede con un objeto después de soltarlo.
- Objetivo del comando IOle
- Puede implementarse mediante objetos (objetos OLE, contenedores OLE y otros objetos) que deseen admitir determinados comandos estándar. Permite a los usuarios consultar si se admiten los comandos y ejecutarlos. Los comandos que un objeto podría querer implementar normalmente pueden incluir cosas como "eliminar", "cortar", "copiar", "pegar", "deshacer", "buscar", "imprimir", "guardar", "zoom", etc. Actualmente se han definido 58 comandos estándar, que incluyen comandos que se utilizan habitualmente en software de oficina, navegadores web y aplicaciones similares.
- Unidad de deshacer 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 que se pueden deshacer se puedan agregar al IOleUndoManager del contenedor .
- Unidad de deshacer de IOleParent
- Permite que una unidad de deshacer contenga otras unidades de deshacer. En esencia, esto permite que la unidad de deshacer actúe como una pila de deshacer, agrupando las unidades de deshacer. Por ejemplo, si se ejecuta una macro, todas las acciones que se pueden deshacer realizadas por la macro se pueden agrupar en una unidad de deshacer.
- Ventana de IOle
- Esta interfaz representa una ventana de un contenedor o un objeto contenido. Permite a los usuarios obtener el identificador de la ventana y activar o desactivar la función de ayuda contextual. Cuando la función de ayuda contextual está activada, normalmente el puntero del ratón cambia a una flecha con un signo de interrogación para indicar que al hacer clic en un elemento de la interfaz de usuario se abrirá una ventana de ayuda.
Competencia
La tecnología OpenDoc intentó competir con OLE. Algunos de los competidores de Microsoft [ ¿quiénes? ] consideraban que OpenDoc era más robusto y más fácil de usar. OpenDoc permitía a los usuarios ver y editar información en distintas aplicaciones, compitiendo directamente con el estándar OLE propietario de Microsoft. En 1993, algunos competidores de Microsoft establecieron un consorcio llamado Component Integration Laboratories ("CIL") para desarrollar OpenDoc como un estándar abierto para la vinculación e incrustación entre plataformas.
Microsoft exigió la compatibilidad con OLE como condición para la certificación de la compatibilidad de una aplicación con Windows 95. Microsoft anunció inicialmente que las aplicaciones que utilizaran OpenDoc se considerarían compatibles con OLE y recibirían la certificación para Windows 95. Microsoft revirtió más tarde la decisión y dijo que las aplicaciones que utilizaran OpenDoc podrían no recibir la certificación en absoluto. Microsoft retuvo las especificaciones y 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 ver o editar archivos fuera de Microsoft Windows (por ejemplo, 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). [2] [3] [4] [5] Si no hay disponible un software que comprenda un objeto OLE, el objeto generalmente se reemplaza por una imagen (representación de mapa de bits del objeto) o no se muestra en absoluto. [6] [7] [8]
Véase también
Referencias
- ^ Este artículo se basa en material tomado de Object+Linking+and+Embedding en el Diccionario gratuito en línea de computación antes del 1 de noviembre de 2008 e incorporado bajo los términos de "relicencia" del GFDL , versión 1.3 o posterior.
- ^ Byfield, Bruce (23 de agosto de 2005). "Comparación de procesadores de texto FOSS: OOo Writer, AbiWord y KWord". Linux.com . The Linux Foundation. Archivado desde el original el 6 de noviembre de 2020 . Consultado el 29 de septiembre de 2020 .
- ^ Byfield, Bruce (28 de julio de 2005). "Compartir archivos entre OpenOffice.org y Microsoft Office". Linux.com . The Linux Foundation. Archivado desde el original el 6 de noviembre de 2020 . Consultado el 29 de septiembre de 2020 .
- ^ Sharma, Mayank (20 de noviembre de 2008). "SoftMaker Office 2008 se centra en la compatibilidad con Microsoft Office". Linux.com . The Linux Foundation. Archivado desde el original el 6 de noviembre de 2020 . Consultado el 29 de septiembre de 2020 .
- ^ Lagadec, Philippe (30 de noviembre de 2006). «Seguridad en OpenOffice/OpenDocument y Microsoft Office 2007/Open XML» (PDF) . Conferencia PacSec 2006. Archivado (PDF) desde el original el 22 de julio de 2011. Consultado el 29 de septiembre de 2020 .
- ^ Gong, Rhett (5 de septiembre de 2005). "RE: Objeto OLE: ¿representación en mapa de bits?". Grupo de noticias : microsoft.public.win32.programmer.ole. Usenet: [email protected] . Consultado el 29 de septiembre de 2020 .
- ^ O'Neill, Mike (9 de febrero de 2005). "Un control de edición enriquecido que muestra mapas de bits y otros objetos OLE". Proyecto de código . Archivado desde el original el 31 de diciembre de 2011. Consultado el 29 de septiembre de 2020 .
- ^ "ACC: Por qué los objetos OLE hacen que las bases de datos crezcan". Microsoft . 19 de enero de 2007. Archivado desde el original el 15 de febrero de 2008.
Enlaces externos
- ripOLE: extrae archivos adjuntos de documentos OLE
- Fondo OLE de docs.microsoft.com