История изменений (первая версия, опубликована 28 Aug 2026)
- Первая публикация
«Дважды щёлкнул таблицу в спецификации Word — и меню стало Excel». Так ведёт себя таблица, которую в документ положили не как простой рисунок, а как OLE-объект.
OLE — Object Linking and Embedding (связывание и внедрение объектов). Данные документа, созданные другим приложением, встраивают в документ-контейнер как внедрение или связь. Техническая сущность — COM-объект, который можно внедрить в документ или связать с ним.12
Точка отсчёта — «где лежит тело данных». Когда это ясно, складываются причины, почему документ раздувается, почему после переноса сервера рвётся связь и почему таблица видна, а править её нельзя.
Статья для ИТ малого и среднего бизнеса и разработчиков бизнес-приложений. Сначала сравниваем внедрение и связывание, затем привычные операции, разбор по симптомам, Access и оговорки по безопасности. Внутреннее устройство — COM, структурированное хранилище — в главе 7, решения по дальнейшей эксплуатации и проектированию — в главе 8.
1. Сначала выводы: внедрение — «копия внутри документа», связь — «ссылка на другое место»
Разница внедрения и связывания — где сохраняют тело данных. Переносимость, размер файла и способ обновления следуют из этой разницы.3
| Что сравниваем | Внедрение (Embedding) | Связывание (Linking) |
|---|---|---|
| Где лежит тело данных | Внутри документа-контейнера | У источника. Часто это другой файл |
| Что сохраняет сторона документа | Тело данных и служебные сведения, обычно кэш для отображения | Имя и расположение источника, параметры обновления и прочие служебные сведения, обычно кэш для отображения |
| Когда меняют исходные данные | Во внедрённую копию не попадает | Можно отразить по настройке обновления связи |
| Когда правят объект | Правят копию внутри документа. На исходные данные не влияет | Правят данные источника |
| Размер документа | Обычно больше, чем при той же связи: внутри лежит копия тела | Тела внутри нет, поэтому проще держать маленьким |
| Передача на другой ПК | Независим от исходного файла. Но для правки нужно исходное приложение | С принимающей стороны тоже должен быть путь к источнику |
| Главные оговорки | Раздувание, зависимость от исходного приложения | Разрыв связи, параметры обновления, зависимость от исходного приложения |
Внедрение подходит, когда документ нужно сделать независимым от исходного файла. Связь — когда одни и те же данные делят несколько документов и хотят отражать правки источника. Но обновление связи не всегда автоматическое. Автоматическое оно или ручное — задаёт настройка на стороне документа.456
flowchart TB
accTitle: Разница внедрения и связывания
accDescr: Внедрение целиком сохраняет тело данных внутри документа-контейнера и самодостаточно ценой большего документа; связь кладёт в документ ссылку, параметры обновления и обычно сведения для отображения, а тело остаётся в файле-источнике, поэтому документ меньше и по настройке обновления связи (автоматически или вручную) может отражать правки источника
doc["Документ-контейнер (документ Word и т. п.)"] --> emb["Внедрение: сохраняем вместе с телом данных"]
doc --> lnk["Связь: ссылка, настройки и сведения для отображения (обычно)"]
emb -.-> self["Самодостаточно, но становится больше"]
lnk --> src["Файл-источник (тело здесь)"]
src -.-> upd["Можно отразить правки источника (зависит от настройки)"]
Рис. 1: Держать тело внутри документа или ссылаться на тело в другом месте. Из этой разницы следуют размер, обновление и передача.
«Данные есть внутри документа» и «править можно на любом ПК» — разные вещи. Если остался кэш для отображения, последний вид иногда показывают и без исходного приложения и без источника. База разбора — разделять «видно», «можно править» и «обновлено до актуального».78
На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 25, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle
2. Где встречается и как попадает в документ
2.1 Word, Excel, Access и старые деловые документы
OLE с 1990-х поддерживал документную культуру Windows. Механизм жив и сейчас, но для практики его удобнее видеть не как технологию, которую активно берут в новый дизайн, а как технологию, с которой встречаются внутри существующих документов и баз.
| Место | Вход, которым создают OLE-объект | Примеры содержимого |
|---|---|---|
| Word / Excel / PowerPoint | «Вставка» → «Объект», «Специальная вставка» | Лист Excel, документ Word, рисунок, формула |
| Access | Поле типа «объект OLE» | Изображение, лист Excel, разные файлы |
| Документ RTF | Вставка в прошлом, например из WordPad | Рисунок, объект другого приложения |
| Старые формы и спецификации | Внедрение, которое сделал прежний исполнитель | Данные в расчёте на «откроется двойным щелчком» |
Типичный существующий актив — база Access, где фото сотрудников и изображения изделий годами клали в тип «объект OLE». У этого применения есть проблема раздувания; решение о миграции — в главе 5.9
2.2 «Вставка объекта» и «Специальная вставка»
В «Вставке объекта» выбирают: создать новый объект или сделать его из существующего файла. Есть и способ отображения «в виде значка».
В «Специальной вставке» кроме формата данных выбирают внедрение или связь. Стоящие там пункты «объект …» — варианты вставки как OLE. От простой вставки рисунком отличаются и сохраняемые данные, и последующий способ правки.1011
Эти два диалога соответствуют стандартным Insert Object / Paste Special OLE; в MFC есть и классы для их показа. Чем путь из копирования и перетаскивания отличается от прямого создания из зарегистрированного класса или файла — в 7.1.1012
3. Что происходит по двойному щелчку
3.1 Контейнер — «вместилище», приложение правки — «сервер»
Если внутри документа Word лежит таблица Excel, Word — OLE-контейнер, а Excel, отвечающий за правку таблицы, — OLE-сервер. Документ, в котором живут данные нескольких приложений, в OLE называют составным документом.12
Word не реализует все функции правки Excel. Это механизм, который при работе с объектом пользуется возможностями исходного приложения. Поэтому даже если тело данных сохранено внутри документа, для правки исходное приложение всё равно нужно.
3.2 Двойной щелчок — выполнение «основного verb», который задаёт сам объект
OLE-объект определяет доступные к себе действия как verb. Для таблицы это «править», для звука — «воспроизвести».
Приложение-контейнер по двойному щелчку и подобным действиям вызывает IOleObject::DoVerb. Содержание основного verb (OLEIVERB_PRIMARY) — действия по умолчанию — задаёт не контейнер, а сторона объекта. DoVerb сам запускает приложение OLE-сервера и выполняет действие, подходящее этому объекту. Двойной щелчок не всегда означает «править».13
3.3 Когда правят внутри Word, а когда открывают отдельным окном
Если и внедрённый объект, и контейнер поддерживают In-Place Activation (активацию на месте), править можно внутри окна контейнера. Строка меню сменяется составной строкой меню, в которой смешаны меню контейнера и сервера. Меню правки Excel внутри Word — как раз этот механизм. Щелчок снаружи деактивирует объект, и меню возвращается к исходному.14
sequenceDiagram
accTitle: От двойного щелчка до In-Place Activation
accDescr: Приложение-контейнер по двойному щелчку вызывает DoVerb IOleObject с основным verb, OLE запускает приложение-сервер; если и контейнер, и сервер поддерживают In-Place Activation, внедрённый объект правят внутри окна контейнера со смешанным меню, а щелчок снаружи деактивирует и возвращает исходное меню (иначе правка идёт в отдельном окне)
participant U as Пользователь
participant C as Приложение-контейнер (Word и т. п.)
participant S as OLE и приложение-сервер
U->>C: Двойной щелчок по внедрённому объекту
C->>S: Выполнить основной verb через DoVerb
alt Оба поддерживают In-Place Activation
S->>C: Запуск сервера, смешение меню
U->>C: Правка на месте
U->>C: Щелчок снаружи объекта
C->>S: Деактивация, возврат к исходному меню
else Кто-то не поддерживает
S->>C: Правка в отдельном окне
end
Рис. 2: Чтобы править внедрение на месте, нужна поддержка и контейнера, и сервера. Иначе правка идёт в отдельном окне.
Как откроется — зависит от вида объекта, выполняемого verb и поддержки приложений.
| Условие | Как открывается |
|---|---|
| Внедрение, оба поддерживают In-Place Activation, правка на месте | Правка внутри окна контейнера |
| Внедрение, но кто-то не поддерживает In-Place Activation | Правка в отдельном окне |
Внедрение с указанным OLEIVERB_OPEN |
Открытие в отдельном окне |
| Связанный объект | Всегда открывается в отдельном окне |
In-Place Activation предполагает внедрение и со связью не используется. Для контейнера и сервера реализация необязательна. «Тот же документ, а открывается иначе» само по себе ещё не поломка.11413
4. Разбор по симптомам: не обновляется, большой, не открывается
4.1 Таблица видна, а правки источника не отражаются
Проверяют расположение источника и способ обновления связи. На стороне документа у связи лежит не тело данных, а служебные сведения — имя и расположение источника, параметры обновления — и обычно кэш для отображения.155
Путь к источнику ведёт моникер (moniker) — компонент COM. Если из-за переноса файлового сервера, переименования папки, смены пути общей папки или удаления исходного файла новое расположение проследить нельзя, разрешение связи срывается. Это и есть разрыв связи.
Если кэш для отображения сохранён, в документе остаётся старая таблица. То, что таблица видна, не доказательство, что связь исправна. У объекта, созданного без кэша, не останется и этого последнего вида.78
Чинят в «Изменение связей» документа, переназначая путь источника на новое место. Если путь верный, а обновления нет, возможно, просто задано ручное обновление — проверьте и способ. Когда отражать правки источника — задаёт настройка автоматического или ручного обновления.6
Если документов со множеством связей много, инвентаризацию до переноса и обновление связей после него включают в план переноса файлового сервера. По возможности планируют и массовое обновление. Если заметить только после переноса, придётся по каждому документу искать источник, которым пользовался прежний исполнитель.
4.2 Документ Word или Excel необычно большой
Проверяют, нужна ли повторная правка, и пересматривают, должно ли тело данных лежать внутри документа. Внедрение копирует тело внутрь документа, поэтому обычно оно больше той же связи. Обычно сохраняется и кэш для отображения, так что внутри не обязательно только данные для правки.47
Если отчёт с множеством внедрённых таблиц раздулся и открывается долго, подозревают эту структуру. Способ правки выбирают по тому, как данными пользуются.
| Как этими данными пользуются | Как пересмотреть |
|---|---|
| Повторная правка на документе не нужна | Вставить как рисунок |
| Нужно делить исходные данные и отражать правки | Исходный файл раздают отдельно, в документ кладут связь |
| Исходные данные ведут отдельно, в документе нужен только вид | Исходный файл раздают, в документ кладут только рисунок |
Но перевод на связь ради размера добавляет ответственность за источник. У раздаваемых документов ссылка легко рвётся, поэтому простое «все внедрения заменить связями» не подходит.
4.3 Двойной щелчок не открывает и не даёт править
Сначала проверяют, есть ли исходное приложение этого объекта и на этом ПК. Самодостаточность внедрения — про место хранения данных, а не про то, что функции правки тоже лежат в документе.
Если исходного приложения нет, при сохранённом кэше для отображения можно пользоваться только этим видом. Кэшированные данные отображения рассчитаны на то, что контейнер сможет ими воспользоваться, даже когда приложение-сервер не запущено или недоступно.7
Но если вставлено «в виде значка», значок виден, а внутрь не заглянуть. У объекта без самого кэша не останется и последнего вида. Есть кэш или нет — задаёт OLERENDER при создании.8
Если исходное приложение есть, а открыть нельзя, разбирают в таком порядке.
- Совместимость версий приложения. Иногда нужна смена вида; у OLE есть и стандартный диалог преобразования.
- Отсутствие или повреждение регистрации COM-класса (CLSID). Иногда регистрацию чинит переустановка приложения.
- Блокировка параметрами безопасности и повреждение документа.10
Для документа неизвестного происхождения открываемость не ставят выше, а объекты не активируют. Обращение с точки зрения безопасности — в главе 6.
5. В Access разделяют «только хранить» и «нужно поведение OLE»
5.1 Картинка в типе «объект OLE» легко раздувает базу
Тип «объект OLE» в Access — тип поля, чтобы внедрять и связывать в таблице электронные таблицы Excel, документы Word, рисунки, звук и тому подобное. Верхняя граница — около 1 ГБ.9
Если этот тип берут только чтобы хранить фото сотрудников и изображения изделий, страдает эффективность хранилища. Microsoft пишет, что тип «вложение» гибче типа «объект OLE» и не создаёт растр исходного файла, поэтому хранилище использует эффективнее.9
Но смена на тип «вложение» не снимает верхнюю границу объёма.
| Пункт | Ограничение и свойства |
|---|---|
| Формат, в котором доступен тип «вложение» | .accdb |
| Максимальный размер базы целиком | 2 ГБ |
| Максимальный размер каждого вкладываемого файла | 256 МБ |
| Показ изображений | BMP, PNG, JPEG и подобные показываются без дополнительного ПО |
Это ограничения типа «вложение» Access. С верхней границей около 1 ГБ у типа «объект OLE» объект другой.16
5.2 Если только хранить — тип «вложение» или папка и пути
В новом дизайне, где нужно только сохранять изображения и файлы, тип «объект OLE» выбирать не обязательно. Смотрят тип «вложение» или схему «файлы в папке, в БД только путь». Для существующей БД эти два варианта — цели миграции.
Другое дело, если нужны свойственные OLE действия — связь, активация и т. п. Тогда решение включает и сохранение как есть. Не «тип объект OLE, значит сразу заменить», а сначала разделить: простое хранение это или объект должен работать как объект.916
6. Безопасность: обычное внедрение и пакет OLE разбирают отдельно
6.1 Документ становится входом, который запускает другое приложение
В OLE объект другого приложения вносят в документ и запускают на ПК, который документ открыл. Эта структура удобна и атакующему как средство доставки.
На практике уязвимость CVE-2014-4114, позволяющая выполнить произвольный код, например, файлом PowerPoint с поддельным OLE-объектом, использовалась в целевых атаках. Форматы Office, умеющие хранить OLE-объект, могут стать путём атаки, и «просто читаю документ» оказывается входом в выполнение.17
6.2 Активацию пакета OLE запрещают организационно
Особого внимания требует пакет OLE (Object Packager). Это старый механизм, который оборачивает произвольный файл как OLE-объект в документ; внутрь можно положить и исполняемый файл. Опубликованы и уязвимости удалённого выполнения кода, связанные с Object Packager.18
Поэтому усиление — запретить активацию пакета OLE в Word, Excel и PowerPoint настройкой реестра. Руководство Microsoft под Essential Eight правительства Австралии показывает, как раздать по организации сценарий PowerShell для этой настройки через Intune.19
Эксплуатацию делят на три пункта.
- Объекты в документах неизвестного происхождения не открывать и не давать открывать. Активацию считают действием того же веса, что открытие другого файла.
- Активацию пакета OLE блокировать организационно. В обычной работе она почти не нужна, поэтому на личную внимательность не полагаются.
- Обычное внедрение и связывание внутренних документов оптом не запрещать. Риск пакета и поддельного документа отделяют от существующего делового использования.
Вывод статьи — не «запретить OLE целиком». Не останавливать работу запретом даже обычного внедрения таблицы Excel, а точечно работать с объектами неизвестного происхождения и пакетами OLE.
7. Внутреннее устройство: роли COM, структурированного хранилища и моникера
Дальше — ближе к реализации, что нужно для сопровождения бизнес-приложений и обследования документных активов. Симптомы выше сопоставляем с «какой механизм за что отвечает».
7.1 Три основания составного документа OLE
Составной документ OLE стоит на COM, структурированном хранилище и единой передаче данных. Объект помимо IUnknown COM открывает собственные интерфейсы составного документа — IOleObject, IViewObject2 и другие. Связанный объект дополнительно реализует IOleLink.2
| Основание | За что отвечает | Основные интерфейсы |
|---|---|---|
| COM | Сущность объекта и контракт операций | IUnknown, IOleObject, IViewObject2, у связи IOleLink |
| Структурированное хранилище | Иерархическое сохранение внутри документа | IStorage, IStream |
| Единая передача данных | Вход, которым из копирования и перетаскивания делают внедрение и связь | IDataObject |
На пути передачи данных OLE-сервер отдаёт свои данные через IDataObject и специальными форматами буфера обмена сообщает контейнеру, можно ли вставить как внедрение и можно ли как связь. Отсюда варианты «Специальной вставки».12
Но не всякое создание идёт через IDataObject. Создание нового из «Вставки объекта» и создание из существующего файла — другой путь: объект делают напрямую из зарегистрированного класса или файла. Сам механизм буфера обмена и перетаскивания разобран в статье «Буфер обмена и перетаскивание: OLE-передача данных в бизнес-приложениях».
7.2 Структурированное хранилище — «файловая система внутри одного файла»
В структурированном хранилище внутри одного файла строят иерархию хранилищ (IStorage), соответствующих каталогам, и потоков (IStream), соответствующих файлам. Под корневым хранилищем можно вкладывать подхранилища и потоки.20
Стандартная реализация COM — составной файл (Compound Files). Это единый файловый формат, с которым работают независимо от файловой системы вроде FAT или NTFS; сам формат опубликован как MS-CFB (Compound File Binary File Format).2122
Контейнер готовит место сохранения объекта. Объект, который сохраняется через IPersistStorage, пишет свои данные в переданный IStorage. Если реализация использует IPersistStream, место сохранения — IStream.2
flowchart TB
accTitle: Внутренняя структура составного файла
accDescr: Составной файл под корневым хранилищем держит иерархию хранилищ (каталоги) и потоков (файлы); внедрённый объект с IPersistStorage сохраняется в подхранилище, объект с IPersistStream — в поток; у хранилища внедрения может быть CLSID исходного приложения (иногда пустой); поток кэша для отображения обычно есть, но по заданию при создании может отсутствовать; работает как файловая система внутри одного файла
root["Корневое хранилище (тело документа)"] --> s0["Поток: данные основного текста"]
root --> st1["Хранилище: внедрение (IPersistStorage)"]
st1 --> s1["Поток: данные объекта"]
st1 --> s2["Поток: кэш для отображения (обычно)"]
st1 -.-> cls["Может указать создателя через CLSID (необязательно)"]
root -.-> s3["Поток: сохранение через IPersistStream"]
Рис. 3: Внутри документа строят иерархию, и объект сам сохраняет данные. Различают сохранение через хранилище и через поток.
В записи каталога можно держать CLSID, которым узнают исходное приложение объекта. Если CLSID есть в хранилище внедрения, можно решить, каким приложением объект открывать. Но CLSID бывает пустым, и кэш для отображения по заданию при создании может отсутствовать.228
7.3 Переход на .docx не убрал формат сохранения OLE
Старые форматы Office .doc / .xls — это сам файл как составной файл. Тело документа лежит потоком, внедрённые объекты — подхранилищами.
Текущие .docx / .xlsx — Open XML на ZIP, но двоичные oleObject*.bin устаревшего внедрения OLE по-прежнему хранятся в формате составного файла. С другой стороны, внедрение между новыми документами Office иногда кладёт файл вроде .xlsx внутрь ZIP как есть.22
| Что сохраняется | Сосуд сохранения |
|---|---|
Старые форматы Office .doc / .xls |
Весь файл — составной файл |
| Устаревшее внедрение OLE внутри текущего формата | Двоичные данные внутри ZIP — составной файл |
| Внедрение между новыми документами Office | Иногда файл кладут внутрь ZIP как есть |
То есть составной файл — не просто «старый формат документа»: он остаётся и внутри текущих документов как вложенный формат сохранения.
7.4 Расположение связи — моникер, обновление ведёт настройка связи
Моникер в COM представляет расположение объекта именем и в нужный момент его разрешает. Это разрешение называют привязкой (bind). Связанный объект через моникер ведёт именование, отслеживание и запуск источника.15
IOleLink — интерфейс, которым контейнеру отдают функции управления источником. По его наличию контейнер отличает внедрение от связи. Даже если документ со связью сохраняют, тело данных связи пишется в источник. В документе остаются имя и расположение, параметры обновления и прочие служебные сведения самой связи и обычно кэш для отображения.15
Это разделение и даёт симптом 4.1 «таблица видна, а не обновляется». Если разрешение источника срывается, до тела не доходят; если доходят, но обновление ручное — само не обновится. Причины складываются, когда раздельно смотрят разрешение расположения, настройку обновления и показ кэша.67
8. Как жить с этим сейчас: не наращивать новую зависимость, существующую — знать
Базовая линия: в новом дизайне на внедрение OLE не опираться, существующие активы вести «поддержанием среды, в которой открывается» и «инвентаризацией». Продолжать пользоваться или нет — решают по ситуации.
| Ситуация | Рекомендуемый ответ | Почему |
|---|---|---|
| Новая работа с документами | Вставлять рисунком, раздавать исходный файл и т. п., не опираясь на внедрение. Связи тоже по минимуму | Избежать раздувания и новой зависимости от среды правки |
| Новое бизнес-приложение хочет класть в документ данные другого приложения | Проектировать через изображение, PDF, вложение файла, а не реализацию OLE-контейнера | Сцен, где окупаются затраты реализации и сопровождения, сейчас почти нет |
| Существующие документы с внедрением | Держать среду, в которой открывается, для важных документов параллельно держать PDF | Даже если данные внутри документа, без исходного приложения править нельзя |
| Документы со множеством связей и перенос файлового сервера | Инвентаризацию и обновление связей включить в план переноса | Если новое расположение проследить нельзя, связь рвётся |
| Access хранит изображения и файлы | Перейти на тип «вложение» или управление путями. Если нужно поведение OLE — решать отдельно | Для простого хранения тип «вложение» гибче и эффективнее |
| Усиление безопасности среды Office | Организационно запретить активацию пакета OLE | Показано как мера усиления под официальные руководства |
Решения по Access и безопасности опираются и на материалы Microsoft.919
При долгом хранении актив — не только данные, но и среда, в которой они открываются. Смена поколений приложений и ОС со временем снимает предпосылку, что исходное приложение ещё можно запустить. Кроме PDF важных документов нужны меры вроде поддержания среды открытия на виртуальной машине.
Пока Windows держит обратную совместимость, механизм OLE продолжит работать. Но откроется ли конкретный объект — зависит от того, осталось ли исходное приложение. Если эта предпосылка обеспечена, спешить всё вычищать не нужно.
В инвентаризации держат три вещи: серверы с источниками связей, документы с внедрением, базы с типом «объект OLE». Когда эта зависимость видна, перенос, усиление безопасности и миграцию можно заложить в план.
9. Итог
OLE-объект — COM-объект, которым данные документа другого приложения обрабатывают как внедрение или связь. Внедрение сохраняет тело внутри документа, связь ссылается на тело в другом месте. Сначала зафиксируйте эту разницу.245
Дальше разделяйте отображение, правку и обновление. Даже если кэш для отображения остался, без исходного приложения править нельзя, без пути к источнику — обновлять. Как открывается по двойному щелчку, тоже зависит от вида объекта, verb и поддержки In-Place Activation.
В новой эксплуатации зависимость не наращивают; существующие документы держат, зная среду открытия и адреса ссылок. Для простого хранения изображений и файлов в Access берут тип «вложение» или управление путями, активацию пакета OLE блокируют организационно.
COM, буфер обмена и перетаскивание и составной документ этой статьи — разные грани слова OLE. Если разделить роли — основа компонентов, передача данных, интеграция в документ — проще понять, что происходит внутри старых деловых активов.
Похожие статьи
- Что такое COM / ActiveX / OCX — различия и связь
- Буфер обмена и перетаскивание: OLE-передача данных в бизнес-приложениях
- STA и MTA в COM: модель потоков и как не получить зависание
- Почему после работы с Excel из C# остаётся EXCEL.EXE — освобождение COM-ссылок и решение о замене
- Как сегодня поступать с ActiveX / OCX: оставить, обернуть или заменить
- Продление эксплуатации и миграция приложений VB6 / Access — таблица решений: оставить, обернуть или заменить
Смежные области консультирования
Компания KomuraSoft LLC занимается обследованием и миграцией наследия документов и баз, где замешаны OLE и COM (уход от типа «объект OLE» в Access, инвентаризация документов с внедрением и перевод в PDF, массовое устранение разрывов связей), сопровождением и доработкой бизнес-приложений с COM-компонентами, проектированием приложений, связанных с Office. Можно начать с этапа «непонятно, что происходит, когда по этому документу дважды щёлкают».
- Разработка приложений для Windows
- Разработка COM-компонентов
- Технические консультации и ревью дизайна
- Связаться с нами
Справочные ссылки
-
Microsoft Learn, OLE Background. О том, что OLE происходит от акронима Object Linking and Embedding; документ OLE (составной документ) объединяет данные нескольких приложений; роли контейнера и сервера; обзор In-Place Activation (визуальной правки) и то, что элемент связи In-Place Activation не получает. ↩ ↩2 ↩3
-
Microsoft Learn, Compound Documents. О том, что составной документ OLE стоит на COM, структурированном хранилище и единой передаче данных; объект составного документа — COM-объект, который можно внедрить в документ или связать с ним, и открывает собственные интерфейсы IOleObject, IOleLink, IViewObject2; объект сам ведёт своё сохранение через IPersistStorage/IPersistStream, а контейнер поставляет IStorage. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Linking and Embedding. О двух видах объектов составного документа — связи и внедрении — и о том, что разница места хранения исходных данных влияет на переносимость, активацию, обновление и размер. ↩
-
Microsoft Learn, Embedded Objects (COM). О том, что внедрённый объект физически сохраняется внутри составного документа вместе со служебными сведениями; документ обычно больше, чем при связи; правки источника во внедрённую копию не попадают; плюсы — переносимость без разрыва связи при передаче на другой ПК и In-Place Activation. ↩ ↩2 ↩3
-
Microsoft Learn, Linked Objects. О том, что у связанного объекта исходные данные остаются у источника, а в документе сохраняются только ссылка и сведения для отображения; размер документа держат маленьким; правки источника отражаются во всех документах со связью; активация связи запускает приложение-сервер. ↩ ↩2 ↩3
-
Microsoft Learn, OLEUPDATE enumeration (oleidl.h). О том, что обновление кэша связанного объекта бывает автоматическим (OLEUPDATE_ALWAYS) и ручным (OLEUPDATE_ONCALL), что соответствует пунктам автоматического и ручного обновления в диалоге связей; при ручном обновление идёт только при вызове IOleObject::Update или IOleLink::Update. ↩ ↩2 ↩3
-
Microsoft Learn, IOleCache interface (oleidl.h). О интерфейсе управления кэшированными внутри объекта данными отображения; кэшированные данные отображения контейнер объекта может использовать, даже когда приложение-сервер не запущено или недоступно. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, OLERENDER enumeration (oleidl.h). Перечисление, указывающее вид локального кэша, который требуют при создании внедрения или связи; OLERENDER_NONE не требует локально кэшируемой способности рисования и получения данных (кэша для отображения нет). ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, DataType property (Access). О том, что тип «объект OLE» Access предназначен для внедрения и связывания в таблице объектов вроде электронных таблиц Excel, документов Word, рисунков и звука, верхняя граница около 1 ГБ; тип «вложение» гибче типа «объект OLE» и не создаёт растр исходного файла, поэтому хранилище использует эффективнее. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Dialog boxes in OLE. О ролях стандартных диалогов OLE: Insert Object (вставка объекта из нового или существующего файла и отображение значком), Paste Special (выбор формата и внедрение/связь/отображение значком), Change Icon, Convert (смена вида внедрённого или связанного элемента). ↩ ↩2 ↩3
-
Microsoft Learn, Selection.PasteSpecial method (Word). О методе VBA Word, соответствующем «Специальной вставке»: кроме формата вставки можно управлять вставкой связью через аргумент Link и отображением значком через DisplayAsIcon. ↩
-
Microsoft Learn, Creating Linked and Embedded Objects from Existing Data. О том, что создание внедрённых и связанных объектов начинается с передачи данных IDataObject через буфер обмена или перетаскивание; OLE-сервер в порядке убывания точности отдаёт специальные форматы буфера обмена для создания внедрения и связи; команда, соответствующая «Специальной вставке», позволяет выбрать внедрение или связь. ↩ ↩2
-
Microsoft Learn, IOleObject::DoVerb method (oleidl.h). О том, что verb — действие, которое определяет объект; OLEIVERB_PRIMARY, задающий поведение по двойному щелчку, определяет не контейнер, а объект; DoVerb сам запускает приложение OLE-сервера; OLEIVERB_OPEN открывает внедрённый объект в отдельном окне. ↩ ↩2
-
Microsoft Learn, Implementing In-Place Activation. О том, что In-Place Activation позволяет работать с внедрённым объектом, не покидая документ контейнера; при активации строка меню сменяется составной из меню контейнера и сервера, при деактивации возвращается; реализация для контейнера и сервера необязательна; связанный объект всегда открывается в отдельном окне. ↩ ↩2
-
Microsoft Learn, Linked Objects and Monikers. О том, что связанный объект через моникер именует источник и отвечает за привязку — найти источник и запустить его; IOleLink даёт опознание «это связь» и функции управления источником; при сохранении документа со связью данные пишутся в источник, а на стороне документа остаются только сведения об имени и расположении. ↩ ↩2 ↩3
-
Microsoft Learn, Attachment object (Access). О том, что тип «вложение» доступен в базах формата .accdb; верхняя граница вкладываемых данных — максимальный размер базы 2 ГБ, каждый файл до 256 МБ; изображения BMP, PNG, JPEG и подобные показываются без дополнительного ПО. ↩ ↩2
-
Microsoft Learn, Microsoft Security Bulletin MS14-060 (CVE-2014-4114). О том, что OLE — технология создания и правки составных данных; уязвимость позволяет выполнить произвольный код с правами текущего пользователя, заставив открыть файл с поддельным OLE-объектом; многие форматы файлов, включая Office, умеющие хранить OLE-объект, могут содержать вредоносный OLE-объект; подтверждались ограниченные целевые атаки, эксплуатирующие эту уязвимость. ↩
-
Microsoft Learn, Microsoft Security Bulletin MS12-002. О том, что Windows Object Packager — средство создания пакетов, которые можно вставить в файл; уязвимость удалённого выполнения кода (CVE-2012-0009) из-за некорректной регистрации и реализации и обходные меры. ↩
-
Microsoft Learn, Essential Eight user application hardening. О том, что в руководстве по усилению под Essential Eight правительства Австралии показан порядок раздачи через Intune сценария PowerShell, который вносит ключи реестра, блокирующие активацию пакета OLE в Excel, PowerPoint и Word. ↩ ↩2
-
Microsoft Learn, IStorage interface (objidl.h). О том, что структурированное хранилище позволяет иерархически класть сведения внутри одного файла и называется «файловой системой внутри файла»; хранилище соответствует каталогу, поток — файлу; под корневым хранилищем можно вкладывать подхранилища и потоки. ↩
-
Microsoft Learn, Compound Files. О том, что составной файл — стандартная реализация структурированного хранилища, которую даёт COM; формат не зависит от файловой системы, работает поверх существующей плоской ФС и взаимно открывается между FAT, NTFS и файловой системой Mac; стандартные интерфейсы позволяют перечислять и ссылаться на внутренние объекты. ↩
-
Microsoft Learn, [MS-CFB]: Compound File Binary File Format. Открытая спецификация двоичного формата составного файла. Определение файловосистемной структуры, которая внутри одного файла хранит потоки данных приложения; записи каталога, перечисляющие хранилища и потоки, и их поле CLSID. ↩ ↩2 ↩3
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
WinRT — это COM ── IInspectable, .winmd, языковые проекции и почему WinUI до сих пор стоит на двоичном контракте
WinRT — не управляемая среда выполнения, а ABI: COM плюс метаданные (.winmd) и языковые проекции. От связи IUnknown и IInspectable до ини...
Буфер обмена и перетаскивание: OLE-передача данных в бизнес-приложениях
Таблица из Excel вставляется «криво», а после закрытия исходного приложения вставить уже нельзя — оба случая объясняются тем, что буфер о...
Интеграция с оболочкой Windows ── контекстное меню, сопоставление файлов и изменения в Windows 11
Почему в Windows 11 пункты контекстного меню оказываются за «Показать дополнительные параметры»: разбираем цепочку расширение → ProgID → ...
Office 2024/Microsoft 365: почему не работает ActiveX и как это диагностировать
Когда ActiveX не работает в Office 2024/Microsoft 365, разбираем порядок диагностики: отключение по умолчанию, 32-бит/64-бит, регистрация...
Почему ломаются аргументы ── правила аргументов командной строки Windows
В Windows массива аргументов нет: в CreateProcess уходит одна строка, делит её принимающая сторона. Правила деления CommandLineToArgvW, C...
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Миграция ActiveX
Решения о сохранении, обёртке или замене компонентов COM / ActiveX / OCX.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Разработка приложений для Windows
Бизнес-приложения, интеграция оборудования и средства связи — от требований до разработки.
Использование и перенос существующих активов
Помогаем использовать и переносить активы COM / ActiveX / OCX и зависимости 32/64 бит.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- Чем внедрение отличается от связывания?
- Тем, куда кладут тело данных. При внедрении (Embedding) тело данных объекта целиком сохраняется внутри документа-контейнера. Документ независим от исходного файла, поэтому при передаче на другой ПК ссылка не рвётся (но для правки на том ПК нужно исходное приложение. Если его нет, при сохранённом кэше для отображения остаётся только смотреть его, а объект, показанный значком, не даёт заглянуть внутрь). Файл при этом становится больше, и правки исходных данных в документ не попадают. При связывании (Linking) в документе остаются только ссылка (имя и расположение источника), параметры обновления и сведения для отображения, а тело данных остаётся в файле-источнике. Документ меньше, изменения источника можно отразить в документе (автоматически или вручную — по настройке обновления связи), но если источник перенесли или переименовали и новое расположение проследить нельзя, связь рвётся. Что вставить — внедрение или связь — выбирают в диалогах «Специальная вставка» и «Вставка объекта».
- Почему двойной щелчок по внедрённому объекту в документе не открывает его и не даёт править?
- Самая частая причина — на этом ПК нет приложения, которым объект создали. Правка внедрённого объекта идёт запуском исходного приложения (OLE-сервера), поэтому без приложения можно только показать сохранённый кэш для отображения, а при отображении значком внутрь не заглянуть. Если исходное приложение есть, а открыть всё равно нельзя, по порядку проверяйте: нужна «преобразование» из-за разницы версий; отсутствует или повреждена регистрация COM-класса (CLSID), которую чинит переустановка; повреждён сам документ; активацию блокируют параметры безопасности.
- Почему файл Word или Excel раздувается из-за внедрённых объектов?
- Потому что внедрение копирует тело данных внутрь документа. Документ с внедрением обычно больше документа, который держит тот же объект связью. Кроме того, в документе обычно лежит не только тело для правки, но и кэш для отображения (есть кэш или нет — задаётся при создании). Чтобы уменьшить файл, можно вместо внедрения поставить связь, вставить как рисунок (отказавшись от повторной правки) или отдельно раздать исходный файл, а в документе оставить связь или рисунок. Но связь требует управлять источником, поэтому для раздаваемых документов не подходит.
- После переноса файлового сервера связанные объекты в документах перестали обновляться. Почему?
- Связанный объект внутри документа держит не тело данных, а сведения об имени и расположении источника (моникер), параметры обновления и кэш для отображения. Если из-за переноса сервера, переименования папки или смены пути общей папки расположение источника изменилось и новое проследить нельзя, разрешение связи срывается, и в документе остаётся только старый кэш для отображения (у объектов, созданных без сохранения кэша, не останется и этого вида). Чинить нужно в «Изменение связей» каждого документа, переназначая путь источника на новое место. Если путь верный, а отражения нет, это может быть не разрыв, а ручное обновление — проверьте и способ обновления. При большом числе документов до переноса инвентаризируйте документы со связями и по возможности заложите в план массовое обновление связей.
- Говорят, OLE-объекты опасны с точки зрения безопасности. Можно ли продолжать ими пользоваться?
- Структура OLE — «внести в документ объект другого приложения и выполнить его на стороне, которая открыла» — удобна и атакующему как средство доставки; уязвимости произвольного выполнения кода через поддельные OLE-объекты реально использовались в целевых атаках. Особенно опасен пакет OLE, в который можно обернуть произвольный файл; официальные руководства вроде Essential Eight правительства Австралии рекомендуют запретить активацию пакетов OLE в Word, Excel и PowerPoint настройкой реестра. Запрещать оптом обычное внедрение и связывание во внутренних документах не обязательно; реалистичный компромисс — не открывать объекты в документах неизвестного происхождения и организационно блокировать активацию пакетов OLE.
Об авторе
Страница с профилем автора статьи.
Го Комура
Представитель KomuraSoft LLC
Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.