コンテナ : 高度な機能
更新 : 2007 年 11 月
ここでは、既存のコンテナ アプリケーションにオプションの高度な機能を追加するための手順について説明します。以下の内容について説明します。
コンテナ/サーバー アプリケーションの作成
埋め込みオブジェクトへのリンク
コンテナ/サーバー アプリケーションの作成
コンテナ/サーバー アプリケーションは、コンテナとサーバーの両機能を持つアプリケーションです。たとえば、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 をオーバーライドし、アプリケーションでランタイム エラーが発生しないように確認する必要があります。
新しいアプリケーションを作成し、これをコンテナ/サーバー アプリケーションにするには、アプリケーション ウィザードの [複合ドキュメント サポート] でオプションを選択します。これにより、サポート機能が自動的に作成されます。詳細については、「MFC 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 を参照してください。