Технология, разработанная Microsoft
Object Linking and Embedding ( OLE ) — это фирменная технология, разработанная Microsoft , которая позволяет встраивать и связывать документы и другие объекты. Для разработчиков она принесла OLE Control Extension (OCX ) , способ разработки и использования пользовательских элементов пользовательского интерфейса. На техническом уровне объект OLE — это любой объект, реализующий интерфейс IOleObject
, возможно, вместе с широким спектром других интерфейсов, в зависимости от потребностей объекта.
Обзор
OLE позволяет приложению для редактирования экспортировать часть документа в другое приложение для редактирования , а затем импортировать его с дополнительным содержимым. Например, настольная издательская система может отправить текст в текстовый процессор или изображение в редактор растровых изображений с помощью OLE. [1] Основное преимущество OLE заключается в добавлении различных типов данных в документ из разных приложений, таких как текстовый редактор и редактор изображений. Это создает документ в двоичном формате Compound File и главный файл, на который ссылается документ. Изменения данных в главном файле немедленно влияют на документ, который ссылается на него. Это называется «связыванием» (вместо «внедрением»).
OLE также можно использовать для передачи данных между различными приложениями с помощью операций перетаскивания или буфера обмена .
История
ОЛЕ 1.0
OLE 1.0, выпущенный в 1990 году, был развитием оригинальной концепции динамического обмена данными (DDE), разработанной Microsoft для более ранних версий Windows . В то время как DDE был ограничен передачей ограниченного объема данных между двумя запущенными приложениями, OLE был способен поддерживать активные связи между двумя документами или даже встраивать один тип документа в другой.
OLE-серверы и клиенты взаимодействуют с системными библиотеками с помощью таблиц виртуальных функций , или VTBL. VTBL состоит из структуры указателей функций , которые системная библиотека может использовать для взаимодействия с сервером или клиентом. Серверные и клиентские библиотеки, OLESVR.DLL и OLECLI.DLL , изначально были разработаны для взаимодействия между собой с помощью сообщения WM_DDE_EXECUTE .
Позднее OLE 1.0 превратился в архитектуру для программных компонентов, известную как Component Object Model (COM), а позднее — DCOM .
Когда объект OLE помещается в буфер обмена или внедряется в документ, сохраняется как визуальное представление в собственных форматах Windows (например, битовая карта или метафайл ), так и базовые данные в его собственном формате. Это позволяет приложениям отображать объект без загрузки приложения, использованного для создания объекта, а также позволяет редактировать объект, если установлено соответствующее приложение.
Object Packager , компонент OLE, поставляемый с Windows 3.1 по Windows XP, позволяет «упаковывать» не-OLE-объекты, чтобы их можно было встроить в OLE-клиент.
ОЛЕ 2.0
OLE 2.0 был следующим этапом эволюции OLE, разделяя многие из тех же целей, что и версия 1.0, но был повторно реализован поверх COM вместо использования VTBL напрямую. Новыми функциями были автоматизация OLE , перетаскивание , активация на месте и структурированное хранилище . Моникеры произошли от имен объектов OLE 1 и предоставили иерархическую систему именования объектов и ресурсов, похожую на URL или URI , которые были изобретены независимо. Теперь Windows объединила две технологии, поддерживающие тип URL Moniker и схему URL Moniker.
Пользовательские элементы управления OLE
Пользовательские элементы управления OLE были введены в 1994 году в качестве замены устаревших элементов управления Visual Basic Extension . Вместо их обновления новая архитектура была основана на OLE. В частности, любой контейнер, поддерживающий OLE 2.0, уже мог встраивать пользовательские элементы управления OLE, хотя эти элементы управления не могли реагировать на события, если контейнер не поддерживал это. Пользовательские элементы управления OLE обычно поставляются в виде библиотеки динамической компоновки с расширением .ocx. В 1996 году все интерфейсы для элементов управления (кроме IUnknown) были сделаны необязательными, чтобы уменьшить размер файла элементов управления и ускорить их загрузку; тогда они назывались элементами управления ActiveX .
Технические подробности
Объекты и контейнеры OLE реализованы поверх Component Object Model ; это объекты, которые могут реализовывать интерфейсы для экспорта своей функциональности. Обязательным является только интерфейс IOleObject , но может потребоваться реализация и других интерфейсов, если требуется функциональность, экспортируемая этими интерфейсами.
Чтобы облегчить понимание того, что следует далее, необходимо объяснить некоторую терминологию. Статус вида объекта — это то, является ли объект прозрачным, непрозрачным или непрозрачным со сплошным фоном, и поддерживает ли он рисование с указанным аспектом. Сайт объекта — это объект, представляющий местоположение объекта в его контейнере. Контейнер поддерживает объект сайта для каждого содержащегося в нем объекта.
Далее следует список интерфейсов, сгруппированных по объекту, которому обычно необходимо их реализовать. Интерфейсы, обычно реализуемые объектом OLE, обычно вызываются контейнером OLE, и наоборот. Обратите внимание, что в следующем списке отступ указывает на наследование интерфейсов. Все интерфейсы без отступа являются производными от IUnknown .
OLE-объект
- ОбъектДанные
- При реализации позволяет передавать данные и уведомлять об изменениях данных. Должен быть реализован объектами, которые должны поддерживать перетаскивание, копирование в буфер обмена или вставку из него, или связывание или внедрение в содержащий документ.
- ObjectWithSite
- Позволяет вызывающему информировать объект OLE о своем сайте. Эта функциональность также предоставляется OleObject , но ObjectWithSite может использоваться, если поддерживается, если OleObject не используется для других целей.
- ОлеКэш
- Позволяет кэшировать визуальные представления из DataObject . Это позволяет встроенному объекту сохранять свое визуальное представление, что позволяет отображать его позже без необходимости запускать приложение, которое использовалось для создания объекта.
- Обычно используется стандартная реализация.
- OleCache2
- Обеспечивает более детальный контроль над кэшированием.
- Обычно используется стандартная реализация.
- OleCacheControl
- Этот интерфейс вызывается не контейнером, а внутренне объектом, чтобы позволить ему получать уведомления о запуске его DataObject , тем самым позволяя ему подписываться на уведомления об изменениях данных этого объекта и, таким образом, позволяя ему правильно обновлять кэшированное представление.
- Обычно используется стандартная реализация.
- OleDocument
- Позволяет объекту OLE поддерживать несколько представлений своих данных, а также несколько связанных функций.
- OleDocumentView
- Объект документа (объект, реализующий OleDocument ) реализует этот интерфейс для каждого представления. Он позволяет вызывающему объекту устанавливать местоположение объекта, запрашивать и устанавливать размер объекта, а также показывать и активировать его, а также некоторые связанные функции.
- OleWindow
- OleInPlaceActiveObject
- Вызывается самым внешним контейнером объекта для взаимодействия с ним, пока он активен, например, для обработки сочетаний клавиш в очереди сообщений контейнера, которые предназначены для содержащегося объекта.
- OleInPlaceObject
- Вызывается контейнером для активации или деактивации объекта.
- IOleInPlaceObjectБезоконный
- Объект без окон — это объект, который не имеет собственного окна, но вместо этого отображается в окне своего контейнера. Он используется контейнером для передачи сообщений, полученных окном контейнера, которые предназначены для содержащегося объекта. Например, если мышь перемещается над окном, Windows помещает сообщение о перемещении мыши вместе с координатами мыши в очередь сообщений окна. Если это окно содержит внедренные объекты без окон, сообщение может потребоваться передать такому объекту, если координаты указателя мыши находятся над этим объектом. По аналогичным причинам этот интерфейс также предоставляет доступ к интерфейсу DropTarget объекта .
- ОлеЛинк
- Позволяет объекту поддерживать связывание, например, позволяя контейнеру устанавливать источник связанного объекта.
- Обычно используется стандартная реализация.
- OleObject
- Возможно, самый важный интерфейс для объекта OLE. Например, он позволяет контейнеру информировать объект о своем сайте, инициализировать объект из данных, открывать и закрывать его, запрашивать и устанавливать размер объекта, запрашивать уведомления на AdviseSink контейнера и выполнять объекты, определенные как «глаголы» на объекте. Эти глаголы часто включают «Открыть» или «Изменить», но могут также включать другие глаголы. Один из глаголов определен как основной глагол, и он выполняется, когда пользователь дважды щелкает объект.
- ViewObject
- Позволяет объекту рисовать себя напрямую, не передавая DataObject в контейнер. Для объектов, которые поддерживают как DataObject , так и этот интерфейс, базовая реализация обычно является общей.
- ВидОбъект2
- Кроме того, позволяет вызывающей стороне запрашивать размер объекта.
- ViewObjectEx
- Добавляет поддержку отрисовки прозрачных объектов без мерцания, проверки попадания для объектов неправильной формы и установки размера объекта.
OLE-контейнер
- IAdviseSink
- Позволяет разработчику получать уведомления при сохранении, закрытии или переименовании объекта, а также при изменении его данных или визуального представления.
- IAdviseSink2
- Кроме того, позволяет разработчику получать уведомления при изменении источника ссылки объекта OLE.
- IAdviseSinkEx
- Кроме того, позволяет разработчику получать уведомления при изменении статуса представления объекта OLE.
- IOleClientSite
- Этот интерфейс позволяет вызывающей стороне получать информацию о контейнере и местоположении объекта, а также запрашивать сохранение объекта, изменение его размера, отображение, скрытие и т. д.
- IOleDocumentSite
- Позволяет вызывающему запросить немедленную активацию объекта на этом сайте. Если этот интерфейс реализован, то также должны быть реализованы IOleClientSite , IOleInPlaceSite и IAdviseSink .
- IOleContainer
- Этот интерфейс позволяет вызывающему перечислять встроенные объекты в контейнере или находить такие объекты по имени. Это в первую очередь полезно, если контейнер хочет поддерживать ссылки на встроенные объекты.
- Окно IOle
- IOleInPlaceUIWindow
- Позволяет встроенным объектам согласовывать пространство для панелей инструментов в окне контейнера.
- IOleInPlaceFrame
- Позволяет вызывающему просить контейнер вставить свои пункты меню в пустое меню, которое станет кооперативным меню. Также позволяет вызывающему просить контейнер показать или скрыть это меню, показать или скрыть диалоговые окна и обрабатывать клавиши быстрого доступа, полученные содержащимся объектом, предназначенным для контейнера.
- IOleInPlaceSite
- Если контейнер реализует этот интерфейс, он позволяет активировать встроенные объекты на месте, т. е. без открытия в отдельном окне. Он предоставляет доступ к IOleInPlaceUIWindow контейнера .
- IOleInPlaceSiteEx
- Если контейнер реализует этот интерфейс, он позволяет встроенным объектам проверять, нужно ли им перерисовываться при активации или деактивации. Он также позволяет им запрашивать свой UI для активации.
- IOleInPlaceSiteБезоконный
- Если контейнер хочет поддерживать безоконные встроенные объекты, ему необходимо предоставить встроенным объектам функциональность, чтобы заменить функциональность, обычно предоставляемую окном встроенного объекта. Например, этот интерфейс предоставляет способ доступа к контексту устройства окна контейнера, тем самым позволяя встроенному объекту рисовать в окне контейнера.
- IOleUILinkContainer
- Содержит методы, которые стандартные диалоговые окна OLE, управляющие связанными объектами, используют для обновления связанных объектов в контейнере или для запроса и изменения их источников. Используется диалоговыми окнами "Ссылки", "Изменить источник", "Обновить ссылки" и "Свойства объекта".
- IOleUILinkInfo
- Кроме того, диалоговые окна позволяют запрашивать информацию о том, когда в последний раз обновлялись связанные объекты, а также о том, было ли это сделано автоматически или вручную.
- IOleUIObjInfo
- Содержит методы, необходимые для диалогового окна "Свойства объекта". Например, если пользователь открывает диалоговое окно "Свойства объекта" и запрашивает преобразование объекта в другой тип, вызывается метод этого интерфейса.
- IOleUndoManager
- Предоставляет централизованную службу отмены как для самого контейнера, так и для встроенных объектов. Когда выполняется отменяемое действие, создается IOleUndoUnit и добавляется в IOleUndoManager
Другой
- IDataAdviseHolder
- Методы IDataObject , относящиеся к уведомлениям об изменении данных, могут быть реализованы путем вызова методов этого интерфейса.
- Обычно используется стандартная реализация.
- IOleAdviseHolder
- Методы IOleObject , относящиеся к уведомлениям, могут быть реализованы путем вызова методов этого интерфейса.
- Обычно используется стандартная реализация.
- IDropSource
- Реализуется объектами, которые можно перетаскивать, т. е. которые могут быть источником операций перетаскивания. При реализации позволяет объекту рисовать эффекты перетаскивания и указывать, когда объект отпускается или операция перетаскивания отменяется.
- IDropTarget
- Реализуется объектами, которые принимают сброшенные объекты, т.е. которые могут быть целью операций перетаскивания. При реализации позволяет цели указать, будет ли принят сброшенный объект, и что произойдет с объектом после того, как он будет сброшен.
- IOleCommandTarget
- Может быть реализован объектами (объектами OLE, контейнерами OLE и другими объектами), которые хотят поддерживать определенные стандартные команды. Позволяет вызывающим запрашивать, поддерживаются ли команды, и выполнять команды. Команды, которые объект обычно хочет реализовать, могут включать такие вещи, как «удалить», «вырезать», «копировать», «вставить», «отменить», «найти», «печатать», «сохранить», «масштабировать» и т. д. В настоящее время определены 58 стандартных команд, и они включают команды, обычно используемые офисным программным обеспечением, веб-браузерами и аналогичными приложениями.
- IOleUndoUnit
- Представляет действие, которое можно отменить. Содержит всю информацию, необходимую для отмены действия. Создается объектами и контейнерами, так что отменяемые действия можно добавлять в IOleUndoManager контейнера .
- IOleParentUndoUnit
- Позволяет блоку отмены содержать другие блоки отмены. По сути, это позволяет блоку отмены действовать как стек отмены, группируя блоки отмены вместе. Например, если запущен макрос, все отменяемые действия, выполняемые макросом, могут быть сгруппированы вместе в одном блоке отмены.
- Окно IOle
- Этот интерфейс представляет окно контейнера или содержащегося объекта. Он позволяет вызывающим получать дескриптор окна и переключать функцию контекстной справки. Когда функция контекстной справки включена, указатель мыши обычно меняется на стрелку с вопросительным знаком, чтобы указать, что щелчок по элементу пользовательского интерфейса приведет к открытию окна справки.
Соревнование
Технология OpenDoc пыталась конкурировать с OLE. Некоторые конкуренты Microsoft [ кто? ] считали OpenDoc более надежным и простым в использовании. OpenDoc позволял пользователям просматривать и редактировать информацию в приложениях, напрямую конкурируя с фирменным стандартом OLE от Microsoft. В 1993 году некоторые конкуренты Microsoft создали консорциум под названием Component Integration Laboratories («CIL») для разработки OpenDoc как открытого стандарта для кросс-платформенного связывания и встраивания.
Microsoft потребовала совместимость с OLE как условие сертификации Microsoft на совместимость приложения с Windows 95. Microsoft изначально объявила, что приложения, использующие OpenDoc, будут считаться совместимыми с OLE и получат сертификацию для Windows 95. Позже Microsoft отменила решение и заявила, что приложения, использующие OpenDoc, могут вообще не получить сертификацию. Microsoft удерживала спецификации и отлаженные версии OLE до тех пор, пока не выпустила свои конкурирующие приложения.
Взаимодействие
Использование объектов OLE ограничивает взаимодействие, поскольку эти объекты не поддерживаются широко в программах для просмотра или редактирования файлов за пределами Microsoft Windows (например, внедрение других файлов в файл, таких как таблицы или диаграммы из приложения электронных таблиц в текстовый документ или файл презентации). [2] [3] [4] [5] Если программное обеспечение, понимающее объект OLE, недоступно, объект обычно заменяется изображением (растровое представление объекта) или не отображается вообще. [6] [7] [8]
Смотрите также
Ссылки
- ^ Статья основана на материале, взятом из Object+Linking+and+Embedding в Free On-line Dictionary of Computing до 1 ноября 2008 года и включенном в соответствии с условиями «перелицензирования» GFDL версии 1.3 или более поздней.
- ^ Байфилд, Брюс (2005-08-23). "Сравнение текстовых процессоров FOSS: OOo Writer, AbiWord и KWord". Linux.com . Linux Foundation. Архивировано из оригинала 2020-11-06 . Получено 2020-09-29 .
- ^ Байфилд, Брюс (28.07.2005). «Обмен файлами между OpenOffice.org и Microsoft Office». Linux.com . Linux Foundation. Архивировано из оригинала 06.11.2020 . Получено 29.09.2020 .
- ^ Шарма, Маянк (2008-11-20). «SoftMaker Office 2008 фокусируется на совместимости с Microsoft Office». Linux.com . Linux Foundation. Архивировано из оригинала 2020-11-06 . Получено 2020-09-29 .
- ^ Лагадек, Филипп (2006-11-30). "OpenOffice / OpenDocument и Microsoft Office 2007 / Безопасность Open XML" (PDF) . Конференция PacSec 2006 . Архивировано (PDF) из оригинала 2011-07-22 . Получено 2020-09-29 .
- ^ Гонг, Ретт (2005-09-05). "RE: OLE object - bitmap representation?". Группа новостей : microsoft.public.win32.programmer.ole. Usenet: [email protected] . Получено 2020-09-29 .
- ^ О'Нил, Майк (2005-02-09). "Богатый элемент управления редактированием, отображающий растровые изображения и другие объекты OLE". Code Project . Архивировано из оригинала 2011-12-31 . Получено 2020-09-29 .
- ^ "ACC: Почему объекты OLE вызывают рост баз данных". Microsoft . 2007-01-19. Архивировано из оригинала 2008-02-15.
Внешние ссылки
- ripOLE - извлекает вложения из документов OLE
- Фон OLE с docs.microsoft.com