キャッシュの表示
コンテナー アプリケーションは、ドキュメントが開いているが、オブジェクトのサーバー アプリケーションが実行されていないか、ユーザーのコンピューターにインストールされていない場合に、ユーザーに対してオブジェクトの表示または印刷を行うために、オブジェクトのプレゼンテーションを取得できる必要があります。 ただし、ドキュメント内にある可能性のあるすべてのオブジェクトのサーバーが、すべてのユーザーのコンピューターにインストールされ、常にオンデマンドで実行できることを前提とするのは非現実的です。 常に使用可能な既定のオブジェクト ハンドラーは、オブジェクト プレゼンテーションをドキュメントのストレージにキャッシュし、コンテナーの特定のインストールでのオブジェクト サーバーの可用性に関係なく、任意のプラットフォームでこれらのプレゼンテーションを操作することで、このジレンマを解決します。
コンテナーメイン、画面上にオブジェクトをメインするために必要なデバイスに加えて、1 つ以上の特定のターゲット デバイスの描画プレゼンテーションを含めることができます。 さらに、あるプラットフォームから別のプラットフォームにオブジェクトを移植すると、OLE によってオブジェクトのデータ形式が新しいプラットフォームでサポートされている形式に自動的に変換されます。 たとえば、オブジェクトを Windows から Macintosh に移動すると、OLE はメタファイル プレゼンテーションを PICT 形式に変換します。
埋め込みオブジェクトの正確な表現をユーザーに提示するために、オブジェクトのコンテナー アプリケーションはオブジェクト ハンドラーとのダイアログを開始し、データと描画命令を要求します。 コンテナーの要求を満たすためには、ハンドラーは IDataObject、 IViewObject2、および IOleCache インターフェイスを実装する必要があります。
IDataObject を使用すると、OLE コンテナー アプリケーションからデータを取得し、埋め込みオブジェクトまたはリンク オブジェクトにデータを送信できます。 オブジェクト内のデータが変更されると、このインターフェイスは、オブジェクトが新しいデータをそのコンテナーで使用できるようにする方法を提供し、オブジェクトのコピー内のデータを更新する方法をコンテナーに提供します。 (一般的なデータ転送については、第 4 章「データ転送」を参照してください。
IViewObject2 インターフェイスは、データをメモリやその他の転送メディアに移動またはコピーするのではなく、画面、プリンター、メタファイルなどのデバイス コンテキストでオブジェクトを描画するようにオブジェクトに要求する点を除いて、 IDataObject インターフェイスと非常に似ています。 このインターフェイスの目的は、OLE コンテナーが埋め込みオブジェクトの代替図形式を取得できるようにすることです。これにより、データが既に存在するため、新しい描画命令を取得するだけで、同じデータ オブジェクトのまったく新しいインスタンスを転送する必要がなくなります。 代わりに、 IViewObject2インターフェイスを使用すると、コンテナーは、コンテナーで指定されたデバイス コンテキストに基づいて描画することで、オブジェクトに自身の画像表現を提供するように求めることができます。
IViewObject2 インターフェイスを呼び出すとき、コンテナー アプリケーションは、オブジェクトが実際にレンダリングされるデバイスとは異なるターゲット デバイス上にオブジェクト自体を描画することを指定することもできます。 これにより、コンテナーは必要に応じて、1 つのオブジェクトから異なるレンダリングを生成できます。 たとえば、結果の描画が画面にレンダリングされる場合でも、呼び出し元はプリンターの作成をオブジェクトに要求できます。 もちろん、結果はオブジェクトの印刷プレビューになります。
IViewObject2インターフェイスには、コンテナーがビュー変更通知に登録できるようにするメソッドも用意されています。 データおよび OLE アドバイザリと同様に、ビュー アドバイザリ接続を使用すると、オブジェクトからの呼び出しに応答するのではなく、コンテナーがオブジェクトのレンダリングを独自の利便性で更新できます。 たとえば、オブジェクトのサーバー アプリケーションの新しいバージョンが同じデータの追加ビューを提供する場合、オブジェクトの既定のハンドラーは、各コンテナーの IAdviseSink::OnViewChange の実装を呼び出して、新しいプレゼンテーションが使用可能であることを通知します。 コンテナーは、必要な場合にのみ、アドバイズ シンクからこの情報を取得します。
Windows デバイス コンテキストは 1 つのプロセス内でのみ意味を持つため、プロセス境界を越えて IViewObject2 ポインターを渡すことはできません。 その結果、OLE ローカル サーバーとリモート サーバーはインターフェイスを実装する必要がなく、実装しても正しく機能しません。 IViewObject2インターフェイスを実装するのは、オブジェクト ハンドラーとインプロセス サーバーだけです。 OLE には既定の実装が用意されており、OLE の既定のハンドラーを集計するだけで、独自の OLE インプロセス サーバーとオブジェクト ハンドラーで使用できます。 または、 IViewObject2 の独自の実装を記述することもできます。
オブジェクトは、キャッシュする 必要がある機能をハンドラーに知らせるために、 IOleCache インターフェイスを実装します。 また、オブジェクト ハンドラーはキャッシュを所有し、最新の状態に保たれます。 埋め込みオブジェクトが実行状態に入るにつれて、ハンドラーはサーバー オブジェクトに適切なアドバイザリ接続を設定し、それ自体がシンクとして機能します。 IDataObject および IViewObject2インターフェイスの実装は、クライアント側でキャッシュされたデータから動作します。 ハンドラーの IViewObject2の実装は、クライアント描画要求を満たすためにキャッシュするデータ形式を決定する役割を担います。 ハンドラーの IDataObject の実装は、メモリと埋め込みオブジェクトの基になる IStorage インスタンスの間で、さまざまな形式でデータを取得する役割を担います。 カスタム ハンドラーでは、既定のハンドラーを集計することで、これらの実装を使用できます。
注意
IViewObject2 インターフェイスは IViewObject の単純な機能拡張であり、後者のインターフェイスの代わりに実装する必要があります。現在は廃止されています。 IViewObject メソッドの提供に加えて、 IViewObject2 インターフェイスには追加メンバー GetExtent が 1 つ用意されています。これにより、コンテナー アプリケーションは、最初に IOleObject::GetExtent を呼び出してオブジェクトを実行中の状態に移動することなく、オブジェクトのプレゼンテーションのサイズをキャッシュから取得できます。