コンテナー : 高度な機能
この記事では、既存のコンテナー アプリケーションにオプションの高度な機能を組み込むために必要な手順について説明します。 次のような機能があります。
コンテナー/サーバー アプリケーションの作成
コンテナー/サーバー アプリケーションは、コンテナーとサーバーの両方の働きをするアプリケーションです。 たとえば Microsoft Word for Windows がそれに該当します。 Word for Windows 文書は他のアプリケーションに埋め込むことができますが、Word for Windows 文書に項目を埋め込こともできます。 コンテナーとフル サーバーの両方の働きをするようにコンテナー アプリケーションに変更を加えるプロセスは、フル サーバーを作成するプロセスと似ています (コンテナー/ミニサーバーの複合アプリケーションを作成することはできません)。
サーバー アプリケーションを実装するために必要なさまざまなタスクは、「サーバー: サーバーの実装」の記事に記載されています。 コンテナー アプリケーションをコンテナー/サーバー アプリケーションに変換する場合は、それらと同じタスクをいくつか実行して、コンテナーにコードを追加する必要があります。 考慮すべき重要な事柄を次に示します。
アプリケーション ウィザードによって作成されるコンテナー コードでは、OLE サブシステムが最初から初期化されています。 サポートに向けて、開発者が何かを変更したり追加したりする必要はありません。
ドキュメント クラスの基底クラスが
COleDocumentである箇所はすべて、基底クラスをCOleServerDocに変更します。サーバー自体がインプレース編集に使用されている間は、項目がインプレースで編集されるのを防ぐために
COleClientItem::CanActivateをオーバーライドします。たとえば、MFC OLE サンプル OCLIENT には、コンテナー/サーバー アプリケーションによって作成された項目が埋め込まれています。 OCLIENT アプリケーションを開いて、コンテナー/サーバー アプリケーションによって作成された項目のインプレース編集を行います。 アプリケーションの項目を編集している間に、MFC OLE サンプル HIERSVR によって作成された項目を埋め込むことにしました。 これを行うためにインプレース アクティブ化を使用することはできません。 この項目をアクティブ化するためには、HIERSVR を完全に開く必要があります。 Microsoft Foundation Class ライブラリはこの OLE 機能をサポートしていませんが、
COleClientItem::CanActivateをオーバーライドすれば、この状況をチェックして、アプリケーションで実行時エラーが発生するリスクを回避できます。
新しいアプリケーションを作成していて、それをコンテナー/サーバー アプリケーションとして機能させたければ、アプリケーション ウィザードの [OLE Options] (OLE オプション) ダイアログ ボックスでそのオプションを選択すると、そのサポートが自動的に作成されます。 詳細については、ActiveX コントロールのコンテナー作成の概要に関する記事を参照してください。 MFC のサンプルについては、「MFC のサンプル」を参照してください。
MDI アプリケーションをそれ自体に挿入することはできないことに注意してください。 SDI アプリケーションでない限り、コンテナー/サーバーであるアプリケーションをそれ自体に挿入することはできません。
埋め込みオブジェクトへのリンク
埋め込みオブジェクトへのリンクは、埋め込みオブジェクトへの OLE リンクを含んだドキュメントをユーザーがコンテナー アプリケーション内で作成できる機能です。 たとえば、スプレッドシートを埋め込んだ文書をワード プロセッサ内で作成します。 埋め込みオブジェクトへのリンクをサポートしているアプリケーションであれば、ワード プロセッサの文書に含まれているスプレッドシートへのリンクを貼り付けることができます。 この機能により、アプリケーションは、そのスプレッドシートをワード プロセッサがどこから入手したかがわからなくても、そこに含まれている情報を使用することができます。
アプリケーション内で埋め込みオブジェクトへのリンクを行うには
COleDocumentではなくCOleLinkingDocからドキュメント クラスを派生させます。OLE 開発ツールに含まれているクラス ID ジェネレーターを使用して、アプリケーションの OLE クラス ID (CLSID) を作成します。
アプリケーションを OLE に登録します。
COleTemplateServerオブジェクトをアプリケーション クラスのメンバーとして作成します。アプリケーション クラスの
InitInstanceメンバー関数で、次の手順を実行します。COleTemplateServerオブジェクトのConnectTemplateメンバー関数を呼び出して、そのオブジェクトをドキュメント テンプレートに接続します。COleTemplateServer::RegisterAllメンバー関数を呼び出して、すべてのクラス オブジェクトを OLE システムに登録します。COleTemplateServer::UpdateRegistryを呼び出します。 アプリケーションの起動に "/Embedded" スイッチを使用しない場合、UpdateRegistryには、パラメーターとして OAT_CONTAINER のみを指定する必要があります。 これで、埋め込みオブジェクトへのリンクをサポートするコンテナーとしてアプリケーションが登録されます。アプリケーションの起動に "/Embedded" スイッチを使用する場合、サーバー アプリケーションと同様、そのメイン ウィンドウが表示されないようにする必要があります。
この機能は、MFC OLE サンプル OCLIENT に実装されています。 これを行う方法の例については、このサンプル アプリケーションの OCLIENT.CPP ファイルの InitInstance 関数を参照してください。