オブジェクトリンクと埋め込み (OLE )は、Microsoft が開発した独自の技術で、 ドキュメント やその他のオブジェクトへの埋め込みとリンクを 可能にします。開発者にとっては、カスタムユーザーインターフェイス要素を開発および使用するための方法であるOLEコントロール拡張機能(OCX)をもたらしました。技術的なレベルでは、OLEオブジェクトとは、オブジェクトのニーズに応じて、さまざまな他のインターフェイスとともに、このインターフェイスを実装するあらゆるオブジェクトのことです。IOleObject
歴史
OLE 1.0 1990年にリリースされたOLE 1.0は、マイクロソフトが 以前のバージョンのWindows 向けに開発したオリジナルのダイナミックデータ交換 (DDE)コンセプトを進化させたものでした。DDEは実行中の2つのアプリケーション間で限られた量のデータを転送することしかできませんでしたが、OLEは2つのドキュメント間のアクティブなリンクを維持したり、ある種類のドキュメントを別の種類のドキュメントに埋め込んだりする ことができました。
OLE サーバーとクライアントは、仮想関数テーブル (VTBL) を使用してシステムライブラリと通信します。VTBL は、システムライブラリがサーバーまたはクライアントと通信するために使用できる関数ポインタ の構造体で構成されています。サーバーライブラリであるOLESVR.DLL とクライアントライブラリであるOLECLI.DLLは、元々 WM_DDE_EXECUTE メッセージを使用して相互に通信するように設計されていました。
OLE 1.0は後に進化し、コンポーネントオブジェクトモデル (COM)として知られるソフトウェアコンポーネント のアーキテクチャとなり、さらに後にDCOMと なった。
OLE オブジェクトがクリップボードにコピーされたり、ドキュメントに埋め込まれたりすると、ネイティブの Windows 形式 (ビットマップ やメタファイル など) での視覚表現と、そのオブジェクト独自の形式の基となるデータの両方が保存されます。これにより、アプリケーションはオブジェクトを作成したアプリケーションをロードすることなくオブジェクトを表示できるだけでなく、適切なアプリケーションがインストールされていればオブジェクトを編集することもできます。
OLEのコンポーネントであるオブジェクトパッカーは 、Windows 3.1から Windows XP まで搭載されており、OLE以外のオブジェクトを「パッケージ化」してOLEクライアントに埋め込むことを可能にします。
OLEカスタムコントロール OLE カスタム コントロールは、現在では非推奨となっている Visual Basic Extension コントロールの代替として 1994 年に導入されました。これらのコントロールをアップグレードするのではなく、新しいアーキテクチャは OLE に基づいています。特に、OLE 2.0 をサポートするコンテナであれば、OLE カスタム コントロールを埋め込むことができますが、コンテナがイベントに対応していない限り、これらのコントロールはイベントに反応できません。OLE カスタム コントロールは通常、拡張子 .ocx のダイナミック リンク ライブラリ の形式で提供されます。1996 年に、コントロールのファイル サイズを小さくしてダウンロード速度を速くするために、コントロールのすべてのインターフェイス (IUnknown を除く) がオプションになりました。これらはActiveX コントロール と呼ばれるようになりました。
技術詳細 OLEオブジェクトとコンテナは、コンポーネントオブジェクトモデル の上に実装されています。これらは、インターフェースを実装して機能をエクスポートできるオブジェクトです。IOleObjectインターフェースのみが必須ですが、他のインターフェースによってエクスポートされる機能が必要な場合は、 それらのインターフェースも実装する必要がある場合があります。
以降の説明を分かりやすくするために、いくつかの用語を説明しておきます。オブジェクトの表示状態とは、オブジェクトが透明、不透明、または不透明で背景が単色であるかどうか、そして指定されたアスペクト比での描画をサポートしているかどうかを指します。オブジェクトのサイトとは、コンテナ内におけるオブジェクトの位置を表すオブジェクトです。コンテナは、含まれるすべてのオブジェクトに対してサイトオブジェクトをサポートします。
以下は、通常それらを実装する必要があるオブジェクトごとにグループ化されたインターフェースのリストです。通常、OLE オブジェクトによって実装されるインターフェースは、通常、OLE コンテナによって呼び出され、その逆も同様です。以下のリストでは、インデントはインターフェースの継承を示しています。インデントされていないすべてのインターフェースは、IUnknown から派生しています。
OLEオブジェクト データオブジェクト 実装されると、データの転送とデータ変更の通知が可能になります。ドラッグアンドドロップ、クリップボードへのコピー/貼り付け、または包含ドキュメントへのリンクや埋め込みをサポートするオブジェクトによって実装される必要があります。 ObjectWithSite 呼び出し元がOLEオブジェクトにその場所を通知できるようにします。この機能はOleObject でも提供されていますが、OleObject が他の用途で使用されていない場合は、サポートされている場合はObjectWithSiteを 使用できます。 OleCache DataObject からの視覚的な表現をキャッシュできるようにします。これにより、埋め込みオブジェクトはその視覚的な表現を保存できるため、オブジェクトを作成したアプリケーションを起動することなく、後で表示できるようになります。通常は標準実装が使用されます。 OleCache2 キャッシュに関するよりきめ細かな制御を提供します。 通常は標準実装が使用されます。 OleCacheControl このインターフェースはコンテナから呼び出されるのではなく、オブジェクトが内部的に呼び出し、DataObject の実行時に通知を受け取ることを可能にします。これにより、オブジェクトはそのオブジェクトのデータ変更の通知を購読し、キャッシュされたプレゼンテーションを適切に更新することができます。 通常は標準実装が使用されます。 OleDocument OLEオブジェクトがデータの複数のビューをサポートすること、およびいくつかの関連機能をサポートすることを可能にします。 OleDocumentView ドキュメントオブジェクト( OleDocument インターフェースを実装するオブジェクト)は、すべてのビューに対してこのインターフェースを実装します。これにより、呼び出し元はオブジェクトの位置を設定したり、オブジェクトのサイズを照会および設定したり、オブジェクトを表示およびアクティブ化したり、その他関連する機能を利用したりできます。OleWindow OleInPlaceActiveObject オブジェクトの最上位のコンテナから呼び出され、アクティブな間にそのオブジェクトとやり取りするために使用されます。たとえば、コンテナのメッセージキューにある、そのコンテナに含まれるオブジェクト宛てのアクセラレータキーを処理する場合などに使用されます。 OleInPlaceObject コンテナによって呼び出され、オブジェクトをアクティブ化または非アクティブ化します。 IOleInPlaceObjectWindowless ウィンドウを持たないオブジェクトとは、独自のウィンドウを持たず、代わりにコンテナのウィンドウ内に表示されるオブジェクトのことです。コンテナは、このオブジェクトを使用して、コンテナのウィンドウが受信した、格納されているオブジェクト宛てのメッセージを中継します。たとえば、マウスカーソルがウィンドウ上に移動すると、Windows はマウス移動メッセージとマウス座標をウィンドウのメッセージキューに格納します。このウィンドウにウィンドウを持たない埋め込みオブジェクトが含まれている場合、マウスカーソルの座標がそのオブジェクトの上にあるときは、メッセージをそのオブジェクトに中継する必要があるかもしれません。同様の理由で、このインターフェイスはオブジェクトのDropTarget インターフェイスへのアクセスも提供します。 オレリンク オブジェクトがリンクをサポートできるようにします。たとえば、コンテナがリンクされたオブジェクトのソースを設定できるようにします。 通常は標準実装が使用されます。 OleObject OLE オブジェクトにとって、おそらく最も重要なインターフェースです。たとえば、コンテナがオブジェクトにその場所を通知したり、データからオブジェクトを初期化したり、オブジェクトを開閉したり、オブジェクトのサイズを照会および設定したり、コンテナのAdviseSink で通知を要求したり、オブジェクト上で「動詞」として定義されたオブジェクトを実行したりすることができます。これらの動詞には、「開く」や「編集」などが含まれますが、他の動詞も含まれる場合があります。動詞の 1 つが主動詞として定義され、ユーザーがオブジェクトをダブルクリックしたときに実行されます。 ビューオブジェクト オブジェクトがコンテナにDataObjectを 渡すことなく、自身を直接描画できるようにします。DataObjectとこのインターフェースの両方をサポートするオブジェクト の場合、基盤となる実装は通常共有されます。 ビューオブジェクト2 さらに、呼び出し元がオブジェクトのサイズを照会することも可能になります。 ViewObjectEx 透明なオブジェクトのちらつきのない描画、不規則な形状のオブジェクトのヒットテスト 、およびオブジェクトのサイズ設定のサポートを追加します。
OLEコンテナ IAdvissink オブジェクトが保存、閉じられた、名前が変更されたとき、またはそのデータや視覚的な表示が変更されたときに、実装者が通知を受け取ることができるようにします。 IAdvisSink2 さらに、OLEオブジェクトのリンク元が変更された際に、実装者が通知を受け取ることができるようになります。 IAdvisSinkEx さらに、OLEオブジェクトの表示状態が変更された際に、実装者が通知を受け取ることができるようになります。 IOleClientSite このインターフェースを使用すると、呼び出し元はオブジェクトのコンテナと場所に関する情報を取得できるほか、オブジェクトの保存、サイズ変更、表示、非表示などを要求できます。 IOleDocumentSite 呼び出し元が、このサイト上のオブジェクトを即座にアクティブ化するように要求できるようにします。このインターフェイスを実装する場合は、IOleClientSite 、IOleInPlaceSite 、およびIAdviseSink も実装する必要があります。 IOleContainer このインターフェースを使用すると、呼び出し元はコンテナ内の埋め込みオブジェクトを列挙したり、名前でオブジェクトを検索したりできます。これは、コンテナが埋め込みオブジェクトへのリンクをサポートする場合に特に役立ちます。 IOleWindow IOleInPlaceUIWindow 埋め込みオブジェクトが、コンテナのウィンドウ上にツールバーを配置するためのスペースを確保できるようにします。 IOleInPlaceFrame 呼び出し元は、コンテナに対し、協調メニューとなる空のメニューに自身のメニュー項目を挿入するよう要求できます。また、呼び出し元は、コンテナに対し、このメニューの表示/非表示、ダイアログボックスの表示/非表示、およびコンテナ宛ての包含オブジェクトが受信したアクセラレータキーの処理を要求することもできます。 IOleInPlaceSite コンテナがこのインターフェースを実装している場合、埋め込みオブジェクトをその場でアクティブ化できます。つまり、別のウィンドウで開く必要はありません。コンテナのIOleInPlaceUIWindow へのアクセスを提供します。 IOleInPlaceSiteEx コンテナがこのインターフェースを実装すると、埋め込みオブジェクトは、アクティブ化時または非アクティブ化時に再描画が必要かどうかを確認できます。また、UIのアクティブ化を要求することもできます。 IOleInPlaceSiteWindowless コンテナがウィンドウのない組み込みオブジェクトをサポートする場合、組み込みオブジェクトのウィンドウが通常提供する機能を置き換えるための機能を組み込みオブジェクトに提供する必要があります。たとえば、このインターフェースはコンテナのウィンドウのデバイスコンテキストにアクセスする方法を提供し、それによって組み込みオブジェクトがコンテナのウィンドウに描画できるようにします。 IOleUILinkContainer リンクされたオブジェクトを管理する標準 OLE ダイアログボックスが、コンテナ内のリンクされたオブジェクトを更新したり、ソースを照会および変更したりするために使用するメソッドが含まれています。「リンク」、「ソースの変更」、「リンクの更新」、「オブジェクトのプロパティ」ダイアログボックスで使用されます。 IOleUILinkInfo さらに、ダイアログボックスは、リンクされたオブジェクトが最後に更新された日時、およびそれが自動更新か手動更新かを照会できるようになります。 IOleUIObjInfo 「オブジェクトのプロパティ」ダイアログボックスに必要なメソッドが含まれています。たとえば、ユーザーが「オブジェクトのプロパティ」ダイアログボックスを開き、オブジェクトを別の型に変換するように要求した場合、このインターフェースのメソッドが呼び出されます。 IOleUndoManager コンテナ自体と埋め込みオブジェクトの両方に対して、集中型の元に戻すサービスを提供します。元に戻せる操作が実行されると、IOleUndoUnitが作成され、 IOleUndoManager に追加されます。
他の IDataAdvisorHolder データ変更通知に関連するIDataObject のメソッドは、このインターフェースのメソッドを呼び出すことで実装できます。通常は標準実装が使用されます。 IOleAdviseHolder IOleObject の通知に関連するメソッドは、このインターフェースのメソッドを呼び出すことで実装できます。通常は標準実装が使用されます。 IDropSource ドラッグ可能なオブジェクト、つまりドラッグ&ドロップ操作の起点となるオブジェクトによって実装されます。実装されると、オブジェクトはドラッグ&ドロップ効果を描画したり、オブジェクトがドロップされたとき、またはドラッグ&ドロップ操作がキャンセルされたときを指定したりできるようになります。 ドロップターゲット ドロップされたオブジェクトを受け入れるオブジェクト、つまりドラッグアンドドロップ操作のターゲットとなるオブジェクトによって実装されます。実装されると、ターゲットはドロップされたオブジェクトを受け入れるかどうか、およびドロップされたオブジェクトがその後どうなるかを指定できます。 IOleCommandTarget 特定の標準コマンドをサポートしたいオブジェクト(OLEオブジェクト、OLEコンテナ、その他のオブジェクト)によって実装できます。呼び出し元は、コマンドがサポートされているかどうかを照会したり、コマンドを実行したりできます。オブジェクトが実装したいコマンドとしては、通常、「削除」、「切り取り」、「コピー」、「貼り付け」、「元に戻す」、「検索」、「印刷」、「保存」、「ズーム」などが挙げられます。現在、58個の標準コマンドが定義されており、オフィスソフトウェア、Webブラウザー、および同様のアプリケーションで一般的に使用されるコマンドが含まれています。 IOleUndoUnit 取り消し可能なアクションを表します。アクションを取り消すために必要なすべての情報が含まれています。オブジェクトやコンテナによって作成され、取り消し可能なアクションをコンテナのIOleUndoManager に追加できるようにします。 IOleParentUndoUnit アンドゥユニットが他のアンドゥユニットを含むことを可能にします。つまり、アンドゥユニットがアンドゥスタックとして機能し、複数のアンドゥユニットをグループ化できます。例えば、マクロが実行された場合、マクロによって実行されたすべてのアンドゥ可能な操作を1つのアンドゥユニットにまとめることができます。 IOleWindow このインターフェースは、コンテナまたは格納されているオブジェクトのウィンドウを表します。呼び出し元は、このインターフェースを使用してウィンドウのハンドルを取得したり、コンテキストに応じたヘルプ機能のオン/オフを切り替えたりできます。コンテキストに応じたヘルプ機能が有効になっている場合、通常はマウスカーソルが疑問符付きの矢印に変わり、ユーザーインターフェース要素をクリックするとヘルプウィンドウが開くことを示します。
競争 OpenDoc テクノロジーはOLEに対抗しようと試みました。マイクロソフトの競合他社の中には、OpenDocの方が堅牢で使いやすいと考える企業もありました。OpenDocは、ユーザーがアプリケーション間で情報を表示および編集することを可能にし、マイクロソフト独自のOLE標準と直接競合しました。1993年、マイクロソフトの競合他社の一部は、クロスプラットフォームのリンクと埋め込みのためのオープン標準 としてOpenDocを開発するために、コンポーネント統合研究所(CIL)と呼ばれるコンソーシアムを設立しました。
マイクロソフトは、アプリケーションのWindows 95 との互換性をマイクロソフトが認証する条件として、OLE互換性を要求した。マイクロソフトは当初、OpenDocを使用するアプリケーションはOLEと互換性があるとみなされ、Windows 95の認証を受けると発表した。しかし、後にこの決定を覆し、OpenDocを使用するアプリケーションは認証を受けられない可能性があると述べた。マイクロソフトは、競合するアプリケーションをリリースするまで、OLEの仕様やデバッグ版を公開しなかった。
相互運用性 OLE オブジェクトの使用は相互運用性を制限します。なぜなら、これらのオブジェクトは Microsoft Windows 以外のファイルを表示または編集するプログラムでは広くサポートされていないためです (たとえば、スプレッドシート アプリケーションの表やグラフなどの他のファイルをテキスト ドキュメントやプレゼンテーション ファイルに埋め込む場合など)。[ 3 ] [ 4 ] [ 5 ] [ 6 ] OLE オブジェクトを理解するソフトウェアが利用できない場合、オブジェクトは通常、画像 (オブジェクトのビットマップ表現) に置き換えられるか、まったく表示されません。[ 7 ] [ 8 ] [ 9 ]
参考文献 ↑ この記事は、2008 年 11 月 1 日以前にFree On-line Dictionary of Computing の Object+Linking+and+Embedding から取得した資料に基づいており、 GFDL バージョン 1.3 以降の「再ライセンス」条項に基づいて組み込まれています。 ↑ 高度なWindows(Windows NT 3.5およびWindows 95向けWin32 API開発者ガイド) ↑ Byfield, Bruce (2005-08-23). "FOSSワードプロセッサの比較:OOo Writer、AbiWord、KWord" . Linux.com . The Linux Foundation. 2020-11-06 のオリジナルからアーカイブ済み。2020-09-29に 取得 。 ↑ Byfield, Bruce (2005-07-28). "OpenOffice.org と Microsoft Office 間でのファイルの共有" . Linux.com . The Linux Foundation. 2020-11-06 のオリジナルから アーカイブ済み 。2020-09-29 に 取得 。 ↑ Sharma, Mayank (2008-11-20). "SoftMaker Office 2008はMicrosoft Officeとの互換性に重点を置いています" . Linux.com . The Linux Foundation. 2020-11-06のオリジナルから アーカイブ済み 。2020-09-29に 取得 。 ↑ Lagadec, Philippe (2006-11-30). "OpenOffice / OpenDocument および Microsoft Office 2007 / Open XML セキュリティ" (PDF) . PacSec 2006 カンファレンス . 2011-07-22 のオリジナルから アーカイブ (PDF) . 2020-09-29 に取得 . ↑ Gong, Rhett (2005-09-05). "RE: OLE オブジェクト - ビットマップ表現?" . ニュースグループ : microsoft.public.win32.programmer.ole . Usenet: iZFkEiesFHA.1204@TK2MSFTNGXA01.phx.gbl . 2020-09-29 に取得. ↑ O'Neill, Mike (2005-02-09). "ビットマップやその他のOLEオブジェクトを表示するリッチ編集コントロール" . Code Project . 2011-12-31のオリジナルから アーカイブ済み . 2020-09-29 に取得. ↑ 「ACC: OLE オブジェクトがデータベースを肥大化させる理由」 。 マイクロソフト 。2007年1月19日。 2008年2月15日に オリジナル からアーカイブ済み。
外部リンク ripOLE - OLEドキュメントから添付ファイルを抽出します OLEの背景情報(docs.microsoft.comより)