更新履歴(1件・最終更新 2026年09月05日)
この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。
- 記事の主張を変えず、埋め込みとリンクの比較、症状別の対処、内部構造と運用判断の順に整理した。
- 初版公開
この記事を引用する(DOI(登録済みアーカイブ): 10.5281/zenodo.22170936)
以下のDOIは過去に登録されたアーカイブを指しており、現在の本文とは一致しない場合があります。現在の本文を参照するときは、このページのURLを使用してください。
小村 豪(2026)「OLEオブジェクトとは何か ── 埋め込み・リンクの仕組みと業務文書の落とし穴」合同会社小村ソフト. https://comcomponent.com/blog/what-is-ole-object/
- DOI(登録済みアーカイブ)
- 10.5281/zenodo.22170936
- DOI(前回登録した版)
- 10.5281/zenodo.22170937
「Wordの仕様書にある表をダブルクリックしたら、メニューがExcelに変わった」。これは、表を単なる図ではなく、OLEオブジェクトとして文書に入れているときの動作です。
OLEはObject Linking and Embedding(オブジェクトのリンクと埋め込み)の略です。別のアプリケーションが作った文書データを、埋め込みまたはリンクとして、入れ物になる文書へ統合します。技術的な実体は、文書に埋め込み・リンクできるCOMオブジェクトです。12
理解の出発点は、「データ本体はどこにあるのか」です。ここが分かると、文書が大きくなる理由、サーバー移設でリンクが切れる理由、表は見えるのに編集できない理由を整理できます。
この記事は、中小企業の情シス担当者と業務アプリ開発者向けです。最初に埋め込みとリンクを比較し、身近な操作、症状別の対処、Accessとセキュリティの注意点へ進みます。COM・構造化ストレージなどの内部構造は7章、今後の運用・設計の判断は8章にまとめます。
1. まず結論:埋め込みは「文書内のコピー」、リンクは「別の場所への参照」
埋め込みとリンクの違いは、データ本体を保存する場所です。可搬性、ファイルサイズ、更新のされ方は、この違いから決まります。3
| 比較する点 | 埋め込み(Embedding) | リンク(Linking) |
|---|---|---|
| データ本体の置き場所 | 入れ物の文書の中 | リンク元。多くは別のファイル |
| 文書側に保存するもの | データ本体と管理情報、通常は表示用キャッシュ | リンク元の名前・場所、更新設定などの管理情報、通常は表示用キャッシュ |
| 元データを変更したとき | 埋め込んだコピーには反映されない | リンクの更新設定に応じて反映できる |
| オブジェクトを編集したとき | 文書内のコピーを編集する。元データには影響しない | リンク元のデータを編集する |
| 文書サイズ | 本体の複製を持つため、同じ内容をリンクする場合より一般に大きい | 本体を文書内に持たないため、小さく保ちやすい |
| 別のPCへの受け渡し | 元ファイルから独立する。ただし編集には作成元アプリが必要 | 受け渡し先からもリンク元をたどれる必要がある |
| 主な注意点 | 肥大化、作成元アプリへの依存 | リンク切れ、更新設定、作成元アプリへの依存 |
埋め込みは、文書を元ファイルから独立させたい場合に向きます。リンクは、複数の文書から同じデータを共有し、元の変更を反映したい場合に向きます。ただし、リンクの更新は必ずしも自動ではありません。自動更新か手動更新かは、文書側の設定で決まります。456
flowchart TB
accTitle: 埋め込みとリンクの違い
accDescr: 埋め込みはデータ本体を入れ物の文書の中に丸ごと保存して自己完結する代わりに文書が大きくなり、リンクは文書に参照や更新設定と通常は表示用情報だけを置いてデータ本体はリンク元ファイルに残るため、文書は小さく、リンク更新の設定(自動か手動か)に応じてリンク元の変更を反映できる
doc["入れ物の文書(Word文書など)"] --> emb["埋め込み:データ本体ごと保存"]
doc --> lnk["リンク:参照・設定と表示情報(通常)"]
emb -.-> self["自己完結するが大きくなる"]
lnk --> src["リンク元ファイル(本体はここ)"]
src -.-> upd["元の変更を反映できる(設定次第)"]
図1: 文書の中に本体を持つか、別の場所の本体を参照するか。この違いが、サイズ・更新・受け渡しの性質につながる。
「文書の中にデータがある」ことと、「どのPCでも編集できる」ことは別です。また、表示用キャッシュが残っていれば、作成元アプリやリンク元を利用できなくても、最後の見た目だけが表示される場合があります。「見える」「編集できる」「最新に更新されている」を分けて考えるのが、切り分けの基本です。78
図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全25件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle
2. どこで使われ、どう文書に入るのか
2.1 Word・Excel・Access・古い業務文書で出会う
OLEは1990年代からWindowsの文書文化を支えてきた技術です。今も仕組みは現役ですが、新規設計で積極的に採用する技術というより、既存の文書やデータベースの中で出会う技術として捉えると実務に合います。
| 場所 | OLEオブジェクトを作る入り口 | 中身の例 |
|---|---|---|
| Word / Excel / PowerPoint | 「挿入」→「オブジェクト」、「形式を選択して貼り付け」 | Excelワークシート、Word文書、図、数式 |
| Access | OLEオブジェクト型フィールド | 画像、Excelシート、各種ファイル |
| リッチテキスト(RTF)文書 | ワードパッドなどで過去に行われた貼り付け | 図、他アプリのオブジェクト |
| 古い帳票・仕様書 | 過去の担当者が作った埋め込み | 「ダブルクリックで開く」ことを前提としたデータ |
Accessの社員写真や製品画像をOLEオブジェクト型で保存してきたデータベースも、代表的な既存資産です。この用途には肥大化の問題があり、5章で移行の判断を扱います。9
2.2 「オブジェクトの挿入」と「形式を選択して貼り付け」
「オブジェクトの挿入」では、新しいオブジェクトを作る方法と、既存ファイルから作る方法を選べます。「アイコンで表示」という表示方法もあります。
「形式を選択して貼り付け」では、データの形式に加えて、埋め込みにするかリンクにするかを選びます。ここで並ぶ「〜 オブジェクト」が、OLEとして貼り付ける選択肢です。単なる図として貼ることとは、保存するデータも、その後の編集方法も違います。1011
この2つは、OLEの標準ダイアログであるInsert Object / Paste Specialに対応しており、MFCには表示用のクラスも用意されています。コピー&ペーストやドラッグ&ドロップから作る経路と、登録されたクラスやファイルから直接作る経路の違いは、7.1で説明します。1012
3. ダブルクリックすると何が起きるのか
3.1 入れ物は「コンテナー」、編集を担当するアプリは「サーバー」
Word文書の中にExcelの表がある場合、Wordは入れ物となるOLEコンテナー、表の編集を担当するExcelはOLEサーバーです。ひとつの文書の中で、複数アプリ由来のデータを扱う文書を、OLEの複合ドキュメントと呼びます。12
WordがExcelの編集機能をすべて実装しているわけではありません。オブジェクトを操作するときに、作成元アプリの機能を使う仕組みです。そのため、文書内にデータ本体が保存されていても、編集には作成元アプリが必要になります。
3.2 ダブルクリックは、オブジェクトが決めた「主動詞」の実行
OLEオブジェクトは、自分に対して実行できる操作を動詞(verb)として定義します。表なら「編集」、音声なら「再生」といった操作です。
入れ物アプリは、ダブルクリックなどの操作を受けて IOleObject::DoVerb を呼びます。既定の操作である主動詞(OLEIVERB_PRIMARY)の内容を決めるのは、入れ物ではなくオブジェクトの側です。DoVerb はOLEサーバーアプリを自動的に起動し、そのオブジェクトに合う操作を実行します。ダブルクリックが常に「編集」を意味するわけではありません。13
3.3 Wordの中で編集できる場合と、別ウィンドウで開く場合
埋め込みオブジェクトと入れ物の双方がIn-Place Activation(インプレース アクティブ化)に対応していれば、入れ物のウィンドウ内で編集できます。メニューバーは、コンテナーとサーバーの両方のメニューを合成した複合メニューバーに置き換わります。Wordの中にExcelの編集用メニューが現れるのは、この仕組みです。外側をクリックすると非アクティブ化され、元のメニューへ戻ります。14
sequenceDiagram
accTitle: ダブルクリックからIn-Place Activationまで
accDescr: 入れ物アプリはダブルクリックを受けてIOleObjectのDoVerbで主動詞を実行するとOLEがサーバーアプリを起動し、入れ物とサーバーの双方がIn-Place Activationに対応している場合、埋め込みオブジェクトは入れ物のウィンドウの中でメニューを合成して編集され、外側のクリックで非アクティブ化されて元のメニューに戻る(対応していない場合は別ウィンドウでの編集になる)
participant U as 利用者
participant C as 入れ物アプリ(Wordなど)
participant S as OLE・サーバーアプリ
U->>C: 埋め込みオブジェクトをダブルクリック
C->>S: DoVerbで主動詞を実行
alt 双方がIn-Place Activationに対応
S->>C: サーバー起動・メニューを合成
U->>C: その場で編集
U->>C: オブジェクトの外側をクリック
C->>S: 非アクティブ化・元のメニューへ
else どちらかが非対応
S->>C: 別ウィンドウで編集
end
図2: 埋め込みをその場で編集するには、コンテナーとサーバーの両方の対応が必要。対応していなければ別ウィンドウで編集する。
開き方は、オブジェクトの種類、実行する動詞、アプリの対応によって変わります。
| 条件 | 開き方 |
|---|---|
| 埋め込みで、双方が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 ダブルクリックしても開けない・編集できない
まず、そのオブジェクトの作成元アプリが、今のPCにもあるかを確認します。埋め込みの自己完結性はデータの保存場所の話であり、編集機能まで文書に入っているわけではありません。
作成元アプリがない場合、表示用キャッシュが保存されていれば、その表示だけを利用できます。キャッシュされた表示データは、サーバーアプリが起動していない、または利用できないときでも、コンテナーから利用できるよう設計されています。7
ただし、「アイコンで表示」で貼られている場合は、アイコンが見えても中身を確認できません。キャッシュ自体を持たないオブジェクトでは、最後の見た目も残りません。キャッシュの有無は、作成時の OLERENDER の指定によります。8
作成元アプリがあるのに開けない場合は、次の順で切り分けます。
- アプリのバージョン互換性を確認する。種類の変換が必要な場合があり、OLEには変換用の標準ダイアログもある。
- COMクラス登録(CLSID)の欠落・破損を確認する。アプリの再インストールなどで登録の修復が必要な場合がある。
- セキュリティ設定によるブロックと、文書側の破損を確認する。10
出所不明の文書については、開けるようにすることを優先せず、オブジェクトをアクティブ化しない運用にします。セキュリティ上の扱いは6章で説明します。
5. Accessでは「格納したいだけか、OLEの動作が必要か」を分ける
5.1 画像をOLEオブジェクト型へ入れると肥大化しやすい
AccessのOLEオブジェクト型は、Excelスプレッドシート、Word文書、図、音声などを、テーブルに埋め込み・リンクするためのフィールド型です。上限は約1GBです。9
社員写真や製品画像の保存だけにこの型を使うと、記憶域の効率が問題になります。Microsoftは、添付ファイル型はOLEオブジェクト型より柔軟で、元ファイルのビットマップ画像を作らないため記憶域も効率的に使えると説明しています。9
ただし、添付ファイル型に変えれば容量の上限がなくなるわけではありません。
| 項目 | 制約・性質 |
|---|---|
| 添付ファイル型を利用できる形式 | .accdb |
| データベース全体の最大サイズ | 2GB |
| 添付する個々のファイルの最大サイズ | 256MB |
| 画像の表示 | BMP・PNG・JPEGなどは追加ソフトなしで表示できる |
これらはAccessの添付ファイル型の制約です。OLEオブジェクト型の約1GBという上限とは、対象が異なります。16
5.2 格納だけなら添付ファイル型か、フォルダーとパス管理へ
画像やファイルを保存するだけの新規設計で、OLEオブジェクト型を選ぶ必要はありません。添付ファイル型、またはファイルをフォルダーに置き、DBにはパスだけを持たせる設計を検討します。既存DBでも、この2つが移行先の選択肢です。
一方、リンクやアクティブ化など、OLE固有の動作が必要なら話は別です。この場合は現状維持も含めて判断します。「OLEオブジェクト型だから即座に置き換える」のではなく、単なる格納なのか、オブジェクトとして動かす必要があるのかを、先に分けてください。916
6. セキュリティ:通常の埋め込みとOLEパッケージを分けて扱う
6.1 文書が、別アプリを実行する入り口になる
OLEでは、文書の中へ別アプリのオブジェクトを持ち込み、開いた側のPCで動かします。この構造は、攻撃者にとっても運搬手段になります。
実際に、細工されたOLEオブジェクトを含むPowerPointファイルなどで任意のコードを実行させる脆弱性 CVE-2014-4114 は、標的型攻撃に使われました。OLEオブジェクトを格納できるOffice形式などが攻撃経路になり得るため、「文書を読むだけのつもり」が実行の入り口になってしまいます。17
6.2 OLEパッケージのアクティブ化は組織的に禁止する
特に注意すべきなのが、OLEパッケージ(Object Packager)です。任意のファイルをOLEオブジェクトとして文書へ包み込む古い仕組みで、実行ファイルも格納できます。Object Packagerに関するリモートコード実行の脆弱性も、公表されています。18
このため、Word・Excel・PowerPointでのOLEパッケージのアクティブ化を、レジストリ設定で禁止することが強化策になります。オーストラリア政府のEssential Eightに対応したMicrosoftのガイドは、設定用のPowerShellスクリプトをIntuneで組織へ配布する手順を示しています。19
運用は、次の3点に分けます。
- 出所不明の文書のオブジェクトは開かない・開かせない。アクティブ化は、別のファイルを開くのと同じ重みの操作として扱う。
- OLEパッケージのアクティブ化は組織的にブロックする。通常業務で必要になる場面はまずないため、個人の注意だけに頼らない。
- 社内文書の通常の埋め込み・リンクまで一律禁止にはしない。パッケージや細工された文書のリスクと、既存の業務上の利用を分けて判断する。
この記事の結論は「OLEをすべて禁止する」ではありません。通常のExcel表の埋め込みまで一律に禁止して業務を止めるのではなく、出所不明のオブジェクトとOLEパッケージを重点的に扱う、という整理です。
7. 内部構造:COM・構造化ストレージ・モニカの役割
ここからは、業務アプリの保守や文書資産の調査に必要になる、実装寄りの説明です。これまでの症状を「どの仕組みが担当しているか」に対応づけます。
7.1 OLE複合ドキュメントを支える3つの土台
OLE複合ドキュメントは、COM・構造化ストレージ・統一データ転送の上に成り立ちます。オブジェクトはCOMの IUnknown に加え、IOleObject・IViewObject2 などの複合ドキュメント固有のインターフェースを公開します。リンクオブジェクトは、さらに IOleLink を実装します。2
| 土台 | 担当すること | 主なインターフェース |
|---|---|---|
| COM | オブジェクトの実体と、操作のための契約 | IUnknown、IOleObject、IViewObject2、リンクの IOleLink |
| 構造化ストレージ | 文書内への階層的な保存 | IStorage、IStream |
| 統一データ転送 | コピー&ペーストやドラッグ&ドロップから埋め込み・リンクを作る入り口 | IDataObject |
データ転送の経路では、OLEサーバーが自分のデータを IDataObject で提供し、専用のクリップボード形式を通じて、埋め込みとして貼れるか、リンクとして貼れるかをコンテナーへ伝えます。これが「形式を選択して貼り付け」の選択肢につながります。12
ただし、すべての作成操作が IDataObject を経由するわけではありません。「オブジェクトの挿入」から新規作成する場合や、既存ファイルから作る場合は、登録されたクラスやファイルから直接オブジェクトを作る別経路です。クリップボードとドラッグ&ドロップ自体の仕組みは「クリップボードとドラッグ&ドロップの仕組み」で扱っています。
7.2 構造化ストレージは「ひとつのファイルの中のファイルシステム」
構造化ストレージでは、1つのファイルの中に、ディレクトリに相当するストレージ(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を持たせられ(空のこともある)、表示用キャッシュのストリームは通常保存されるが作成時の指定によっては持たないこともあり、1つのファイルの中のファイルシステムとして働く
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 はZIPベースのOpen XML形式ですが、レガシーなOLE埋め込みのバイナリ oleObject*.bin は、今も複合ファイル形式で格納されます。一方、新しいOffice文書同士の埋め込みでは、.xlsx などのファイルがそのままZIP内に収まることもあります。22
| 保存されるもの | 保存の器 |
|---|---|
旧Office形式の .doc / .xls |
ファイル全体が複合ファイル |
| 現行形式内のレガシーなOLE埋め込み | ZIP内のバイナリが複合ファイル |
| 新しいOffice文書同士の埋め込み | ファイルのままZIP内に格納される場合もある |
つまり、複合ファイルは単に「昔の文書形式」なのではなく、現行の文書の中にも、入れ子の保存形式として残っています。
7.4 リンクの所在はモニカ、更新はリンクの設定が管理する
モニカは、COMでオブジェクトの所在を名前として表し、必要なときに解決するための部品です。この解決をバインドと呼びます。リンクオブジェクトはモニカを使い、リンク元の命名・追跡・起動を管理します。15
IOleLink は、リンク元の管理機能をコンテナーへ提供するインターフェースです。コンテナーは、その有無で埋め込みかリンクかを判別できます。リンクを含む文書を保存しても、リンクのデータ本体はリンク元へ保存されます。文書に残るのは、名前と場所、更新設定などのリンク自身の管理情報と、通常は表示用キャッシュです。15
この分担が、4.1の「表は見えるのに更新されない」につながります。リンク元の解決に失敗すれば本体に到達できず、到達できても手動更新なら自動では更新されません。所在の解決、更新設定、キャッシュの表示を分けて調べると、原因を整理できます。67
8. 今どう付き合うか:新しい依存を増やさず、既存の依存を把握する
新規設計でOLE埋め込みに頼るのは避け、既存資産は「開ける環境の維持」と「棚卸し」で扱うのが基本方針です。使い続けるかどうかは、場面ごとに判断します。
| 場面 | 推奨する対応 | 理由 |
|---|---|---|
| 新規の文書運用 | 図として貼る、元ファイルを共有するなど、埋め込みに頼らない。リンクも最小限にする | 肥大化と、編集環境への新たな依存を避ける |
| 新規の業務アプリで他アプリのデータを文書へ入れたい | OLEコンテナーを実装するより、画像化・PDF化・ファイル添付で設計する | 実装・保守コストに見合う場面が今はほぼない |
| 既存の埋め込み文書 | 開ける環境を維持し、重要文書にはPDF版も併存させる | データが文書内にあっても、作成元アプリが失われると編集できない |
| リンクを多用した文書と、ファイルサーバー移設 | リンクの棚卸しと更新を移設計画に含める | 移設後の場所をたどれなければリンクが切れる |
| Accessで画像・ファイルを格納している | 添付ファイル型かパス管理へ移行する。OLE固有の動作が必要な場合は別途判断する | 単なる格納には、添付ファイル型のほうが柔軟で効率的 |
| Office環境のセキュリティ強化 | OLEパッケージのアクティブ化を組織的に禁止する | 公的ガイドラインに対応した強化策として示されている |
Accessとセキュリティの判断は、それぞれMicrosoftの資料にも対応しています。919
長期保存では、データだけでなく、開ける環境も資産の一部です。アプリの世代交代やOSの変化で、作成元アプリが使えるという前提は失われていきます。重要文書のPDF版を残すことに加え、開ける環境を仮想マシンで維持する、といった手当てが必要です。
OLEの仕組みは、Windowsが後方互換を守り続けている限り動き続けます。ただし、個々のオブジェクトが開くかどうかは、作成元アプリが残っているかに依存します。その前提を確保できているなら、慌てて全廃する必要はありません。
棚卸しでは、リンク元のあるサーバー、埋め込みを含む文書、OLEオブジェクト型を使うデータベースの3つを把握します。この依存関係が分かっていれば、移設、セキュリティ強化、移行を計画に組み込めます。
9. まとめ
OLEオブジェクトは、別アプリの文書データを、埋め込みまたはリンクとして扱うためのCOMオブジェクトです。埋め込みは本体を文書内に保存し、リンクは別の場所の本体を参照する。まず、この違いを押さえてください。245
次に、表示・編集・更新を分けて考えます。表示用キャッシュが残っていても、作成元アプリがなければ編集できず、リンク元をたどれなければ更新できません。ダブルクリック時の開き方も、オブジェクトの種類と動詞、In-Place Activationへの対応によって変わります。
新しい運用では依存を増やさず、既存文書は開ける環境と参照先を把握して維持します。Accessの単なる画像・ファイル格納には添付ファイル型やパス管理を使い、OLEパッケージのアクティブ化は組織的にブロックします。
COM、クリップボードとドラッグ&ドロップ、そして本記事の複合ドキュメントは、OLEという言葉の異なる側面です。コンポーネント基盤、データ転送、文書への統合という役割を分けると、古い業務資産の中で何が起きているのかを追いやすくなります。
関連記事
- COM / ActiveX / OCX とは何か - 違いと関係をまとめて解説
- クリップボードとドラッグ&ドロップの仕組み ── OLEデータ転送を業務アプリで正しく扱う
- COM STA/MTA の基礎知識 - スレッドモデルとハングを避ける考え方
- C#のExcel操作でEXCEL.EXEが残る問題 ── COM参照の解放パターンと置き換えの判断
- ActiveX / OCX を今どう扱うか - 残す・包む・置き換える判断表
- VB6 / Access業務アプリの延命と移行 ── 残す・包む・置き換えるの判断表
関連する相談領域
合同会社小村ソフトでは、OLE・COMが絡むレガシー文書・データベース資産の調査と移行(AccessのOLEオブジェクト型からの脱却、埋め込み文書の棚卸しとPDF化、リンク切れの一括対処)、COMコンポーネントを含む業務アプリの保守・改修、Office連携アプリの設計を扱っています。「この文書、ダブルクリックすると何が起きているのか分からない」という段階からでもご相談いただけます。
参考リンク
-
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. 複合ドキュメントのオブジェクトにリンクと埋め込みの2種類があり、ソースデータの保存場所の違いが可搬性・アクティブ化・更新・サイズに影響することについて。 ↩
-
Microsoft Learn, Embedded Objects (COM). 埋め込みオブジェクトが管理情報ごと複合ドキュメント内に物理的に保存されること、リンクで持つ場合より文書が大きくなること、ソースの変更が埋め込みコピーに反映されないこと、他のPCへ渡してもリンクが壊れない可搬性と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). AccessのOLEオブジェクト型がExcelスプレッドシート・Word文書・図・音声などのオブジェクトをテーブルに埋め込み・リンクするための型で上限が約1GBであること、添付ファイル型が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). Wordの形式を選択して貼り付けに相当するVBAメソッドで、貼り付け形式の指定に加え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形式のデータベースで使えること、添付できるデータの上限がデータベース最大サイズの2GBで個々のファイルは256MBまでであること、BMP・PNG・JPEGなどの画像形式を追加ソフトなしで表示できることについて。 ↩ ↩2
-
Microsoft Learn, Microsoft Security Bulletin MS14-060 (CVE-2014-4114). OLEが複合データの作成・編集を可能にする技術であること、細工されたOLEオブジェクトを含むファイルを開かせることで現在のユーザーの権限で任意のコードを実行できる脆弱性、OLEオブジェクトを格納できるOffice形式ほか多くのファイル形式が悪意あるOLEオブジェクトを含み得ること、本脆弱性を突く限定的な標的型攻撃が確認されていたことについて。 ↩
-
Microsoft Learn, Microsoft Security Bulletin MS12-002. Windows Object Packagerがファイルへ挿入できるパッケージを作成するツールであること、その不適切な登録・実装に起因するリモートコード実行の脆弱性(CVE-2012-0009)と回避策について。 ↩
-
Microsoft Learn, Essential Eight user application hardening. オーストラリア政府のEssential Eightに対応した強化ガイドとして、Excel・PowerPoint・WordでのOLEパッケージのアクティブ化をブロックするレジストリキーを投入するPowerShellスクリプトをIntuneで配布する手順が示されていることについて。 ↩ ↩2
-
Microsoft Learn, IStorage interface (objidl.h). 構造化ストレージが1つのファイル内での階層的な情報格納を可能にし「ファイルの中のファイルシステム」と呼ばれること、ストレージがディレクトリに、ストリームがファイルに相当すること、ルートストレージの下にサブストレージとストリームを入れ子にできることについて。 ↩
-
Microsoft Learn, Compound Files. 複合ファイルがCOMの提供する構造化ストレージの標準実装であること、既存のフラットなファイルシステムの上で動作しFAT・NTFS・Macのファイルシステム間で相互に開けるファイルシステム非依存の形式であること、標準インターフェースにより内部のオブジェクトを列挙・参照できることについて。 ↩
-
Microsoft Learn, [MS-CFB]: Compound File Binary File Format. 複合ファイルバイナリ形式の公開仕様。1つのファイル内にアプリケーション固有のデータストリームを格納するファイルシステム的構造の定義、ストレージ・ストリームを列挙するディレクトリエントリとそのCLSIDフィールドについて。 ↩ ↩2 ↩3
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
クリップボードとドラッグ&ドロップの仕組み ── OLEデータ転送を業務アプリで正しく扱う
Excelの表を貼ると崩れる・コピー元を閉じると貼れない――正体は同じ内容を複数形式で置くクリップボードの仕組みです。標準形式・遅延レンダリング・OLEドラッグ&ドロップから履歴とクラウド同期のポリシーまで解説します。
WinRTはCOMである ── IInspectable・.winmd・言語プロジェクション、そしてWinUIが今もバイナリ契約の上に乗っている理由
WinRTはマネージドランタイムではなく、COMにメタデータ(.winmd)と言語プロジェクションを足したABIです。IUnknownとIInspectableの関係から、デスクトップアプリでのHWND初期化やpackage identityの詰まりどころまで解説します。
Windowsアプリ互換の仕組み ── 互換モード・シム・Compatibility Administratorで古いアプリを延命する
互換モードにチェックを入れると古いアプリが動くのはなぜか。正体であるシム(APIフック)の仕組み、代表的なシムの機能、Compatibility Administratorとsdbinstによる組織展開、効かない限界、延命か移行かの判断までを解説します。
Windowsシェル統合の今 ── 右クリックメニュー・ファイル関連付け・Windows 11の変化
Windows 11で右クリックメニューが「その他のオプションを確認」に隠れる理由を、拡張子→ProgID→verbという関連付けの基本、従来型シェル拡張の注意点、IExplorerCommandとMSIX/sparse packageの新方式まで整理して解説します。
VB6 / Access業務アプリの延命と移行 ── 残す・包む・置き換えるの判断表
VB6とAccessの業務アプリを、残すか、延命するか、置き換えるかをどう判断するか。ランタイムの現状、ACEの32bit/64bit問題、共有フォルダー多人数利用のリスク、SQL Serverへのアップサイズまで判断表で整理します。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
ActiveX / 移行テーマ
COM / ActiveX / OCX を残すか、包むか、置き換えるかを整理するトピックです。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
既存資産活用・移行支援
COM / ActiveX / OCX、32bit / 64bit 制約を抱える既存資産の活用と移行を支援します。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- 埋め込みとリンクは何が違うのですか?
- データ本体をどこに置くかが違います。埋め込み(Embedding)は、オブジェクトのデータ本体を入れ物の文書の中に丸ごと保存します。文書が元ファイルから独立するので、他のPCに渡しても参照が切れることはありません(ただし編集には渡した先のPCにも作成元アプリが必要です。無い場合は表示用キャッシュが保存されていればそれを見るだけになり、アイコン表示のオブジェクトは中身を確認できません)。その代わりファイルは大きくなり、元データを変更しても文書側には反映されません。リンク(Linking)は、文書には参照(リンク元の名前と場所)や更新設定と表示用の情報だけを置き、データ本体はリンク元ファイルに残します。文書は小さく、リンク元の変更を文書に反映できますが(自動か手動かはリンクの更新設定によります)、リンク元が移動・改名されて行き先をたどれなくなるとリンク切れになります。どちらで貼るかは「形式を選択して貼り付け」や「オブジェクトの挿入」ダイアログで選べます。
- 文書内の埋め込みオブジェクトをダブルクリックしても開けない・編集できないのはなぜですか?
- いちばん多い原因は、そのオブジェクトの作成元アプリが今のPCに入っていないことです。埋め込みオブジェクトの編集は作成元アプリ(OLEサーバー)を起動して行うため、アプリがなければ表示用キャッシュが保存されている場合にそれを表示することしかできず、アイコン表示の場合は中身を見ることもできません。作成元アプリがあるのに開けない場合は、バージョンの違いにより「変換」が必要なケース、再インストール等で直るCOMクラス登録(CLSID)の欠落・破損、文書側の破損、セキュリティ設定によりアクティブ化がブロックされているケースを順に疑ってください。
- WordやExcelのファイルが埋め込みオブジェクトで異様に大きくなるのはなぜですか?
- 埋め込みはデータ本体を文書の中に複製して保存する方式だからです。同じオブジェクトをリンクで持つ文書に比べて、埋め込みを持つ文書は一般に大きくなります。さらに文書には通常、編集用のデータ本体に加えて表示用のキャッシュも保存されます(キャッシュを持つかどうかは作成時の指定で決まります)。ファイルを小さくしたい場合は、埋め込みではなくリンクにする、図として貼り付ける(再編集は不要と割り切る)、元ファイルを別途共有して文書にはリンクや図だけを置く、といった選択肢があります。ただしリンクはリンク元の管理が必要になるため、配布する文書には向きません。
- ファイルサーバーを移設したら文書内のリンクオブジェクトが更新されなくなりました。なぜですか?
- リンクオブジェクトが文書内に持っているのは、データ本体ではなく、リンク元の名前と場所の情報(モニカ)や更新設定と表示用のキャッシュだけだからです。ファイルサーバーの移設・フォルダーの改名・共有パスの変更などでリンク元の場所が変わり、変更後の場所をたどれなくなると、リンクの解決に失敗し、文書には古い表示用キャッシュだけが残ります(キャッシュを保存しない指定で作られたオブジェクトでは、その表示も残りません)。修復するには、各文書の「リンクの編集」からリンク元のパスを新しい場所に付け替える必要があります。なお、パスは正しいのに反映されない場合は、リンク切れではなく、リンクが手動更新に設定されているだけのこともあるので、更新方法の設定もあわせて確認してください。文書が大量にある場合は移設前にリンクを含む文書を棚卸しし、可能であればリンクの一括更新を計画に組み込んでください。
- OLEオブジェクトはセキュリティ上危険だと聞きました。使い続けてよいのでしょうか?
- 「文書の中に別アプリのオブジェクトを持ち込み、開いた側で実行する」というOLEの構造は、攻撃者にとっても便利な運搬手段であり、細工されたOLEオブジェクトによる任意コード実行の脆弱性が実際の標的型攻撃に使われてきました。特に任意のファイルを包めるOLEパッケージは危険で、オーストラリア政府のEssential Eightのような公的ガイドラインは、Word・Excel・PowerPointでのOLEパッケージのアクティブ化をレジストリ設定で禁止することを推奨しています。社内文書での通常の埋め込み・リンクまで一律に禁止する必要はありませんが、出所不明の文書のオブジェクトは開かない、OLEパッケージのアクティブ化は組織的にブロックする、という運用が現実的な落としどころです。