コンテナー : 高度な機能
ここでは、既存のコンテナー アプリケーションにオプションの高度な機能を追加するための手順について説明します。 以下の内容について説明します。
コンテナー/サーバー アプリケーションの作成
埋め込みオブジェクトへのリンク
コンテナー/サーバー アプリケーションの作成
コンテナー/サーバー アプリケーションは、コンテナーとサーバーの両機能を持つアプリケーションです。 たとえば、Microsoft Word for Windows はコンテナー/サーバー アプリケーションです。 Word のドキュメントをほかのアプリケーションに埋め込むことも、Word ドキュメントにアイテムを埋め込むこともできます。 コンテナー アプリケーションをコンテナーとフル サーバーを兼ねるようにする方法は、フル サーバーを作成する方法と似ています。ただし、コンテナーとミニサーバーの組み合わせはできません。
「サーバー:サーバーの実装サーバー アプリケーションの実装に必要なタスクの数を示します。 コンテナー アプリケーションをコンテナー/サーバー アプリケーションにするには、この手順の一部に従ってコードを追加する必要があります。 このとき、次の点に注意してください。
アプリケーション ウィザードで作成したコンテナー コードは、OLE サブシステムを既に初期化しています。 OLE のサポートに関して変更や追加は必要ありません。
ドキュメント クラスの基本クラスが COleDocument の場合は、基本クラスを COleServerDoc に変更します。
COleClientItem::CanActivate をオーバーライドし、サーバー自身が埋め込み先編集に使われるときにアイテムの埋め込み先編集を行わないようにします。
たとえば、MFC OLE サンプル プログラム OCLIENT には、コンテナー/サーバー アプリケーションで作成されたアイテムが埋め込まれています。 OCLIENT アプリケーションを開き、コンテナー/サーバー アプリケーションで作成されたアイテムの埋め込み先編集を行います。 アプリケーションのアイテムの編集中に、MFC OLE サンプル HIERSVR で作成されたアイテムを埋め込む必要があるものとします。 アイテムを埋め込むために、埋め込み先編集の有効化を使うことはできません。 HIERSVR を完全に開き、そこでアイテムをアクティブ化する必要があります。 Microsoft Foundation Class ライブラリはこの OLE 機能をサポートしていないので、メンバー関数 COleClientItem::CanActivate をオーバーライドし、アプリケーションでランタイム エラーが発生しないように確認する必要があります。
新しいアプリケーションを作成し、これをコンテナー/サーバー アプリケーションにするには、アプリケーション ウィザードの [複合ドキュメント サポート] でオプションを選択します。これにより、サポート機能が自動的に作成されます。 詳細についてを参照してください「概要:ActiveX コントロール コンテナーを作成する。 MFC サンプルについては、『MFC サンプル』を参照してください。
MDI アプリケーション自身に MDI アプリケーションを埋め込むことはできません。 SDI アプリケーションでない限り、コンテナー/サーバー アプリケーションにそのアプリケーション自身を埋め込むことはできません。
埋め込みオブジェクトへのリンク
埋め込みアイテムへのリンク機能を使うと、コンテナー アプリケーション内の埋め込みオブジェクトへの OLE リンクを持つドキュメントを作成できます。 たとえば、ワード プロセッサのドキュメント内にスプレッドシートを埋め込むものとします。 埋め込みオブジェクトにリンクできるアプリケーションでは、ワード プロセッサのドキュメント内のスプレッドシートにリンクを貼り付けることができます。 この機能を使うと、スプレッドシートを作成した元のプログラムの場所を知らなくても、アプリケーションでスプレッドシート内の情報を利用できます。
アプリケーションで埋め込みオブジェクトにリンクするには
COleDocument ではなく、COleLinkingDoc の派生ドキュメント クラスを作成します。
OLE 開発ツールに含まれている Class ID Generator を使って、アプリケーションの OLE クラス ID (CLSID) を作成します。
アプリケーションを OLE に登録します。
COleTemplateServer オブジェクトをアプリケーション クラスのメンバーとして作成します。
アプリケーション クラスのメンバー関数 InitInstance で以下の処理を行います。
COleTemplateServer ブジェクトのメンバー関数 ConnectTemplate を呼び出し、COleTemplateServer オブジェクトをドキュメント テンプレートに関連付けます。
メンバー関数 COleTemplateServer::RegisterAll を呼び出し、すべてのクラス オブジェクトを OLE システムに登録します。
COleTemplateServer::UpdateRegistry を呼び出します。 アプリケーションの起動時に "/Embedded" スイッチを指定しなかった場合は、関数 UpdateRegistry に渡すパラメーターを OAT_CONTAINER にします。 この関数は、アプリケーションを埋め込みオブジェクトにリンクできるコンテナーとして登録します。
アプリケーションの起動時に "/Embedded" スイッチを指定したときは、サーバー アプリケーションと同じように、主ウィンドウは画面に表示されません。
MFC OLE サンプル OCLIENT にはこの機能があります。 説明した方法の例については、サンプル アプリケーションの OCLIENT.CPP ファイルの関数 InitInstance を参照してください。