Chapter.6

OLE1時代の編集機能


2004/6/24
 ・サンプルソースで、構造体変数をNewで初期化しているものをNewしないように修正。

1.OLEサーバによる編集

OLEサーバは、対応しているファイルを表示することだけが、その機能ではありません。 表示しているファイルを対応するアプリケーションで編集することが出来ます。 これは、サンプルを見てもらった方が、理解が早いと思います。
VB.NETサンプルソース:chap6.vb.lzh(27KB未満 2004/06/24)

サンプルのIOleObject操作メニューには、編集機能を使用するための新メニューDoVerbを追加しています。(下図)

DoVerbメニューは、子メニューを持っており、その中に実際の編集メニューがあります。 編集メニューの内容は、IOleObject.EnumVerbsで取得したデータの一覧となっています。 とりあえず、今回は編集メニューを選択します。すると下のようなキャプションが、Excelのアプリケーションに表示されます。



2.DoVerbとIOleClientSite

編集メニューのどれを選択した場合でも、全て同じメニューハンドラで処理します。 このメニューハンドラは、単純にIOleObject.DoVerbを呼び出しているだけです。 IOleObject.DoVerbは、IOleClientSiteインターフェースを必要とするため、それをクライアントに実装しなければなりません。 IOleClientSiteとは、OLEサーバが必要とする機能で、クライアント側が実装しなければならないものです。 もう少し詳しく説明すると、アプリケーションの動作と密接に関連する機能であるため、クライアントが判断しなければならない機能の集合体となっています。 (現時点のコードでは、大半のメソッドを使用しないのですが・・・。)

このサンプルで、アプリケーションを起動しデータを編集すると、データを更新されたことが、IAdviseSink::OnDataChangeによって通知されます。 また、起動したアプリケーションを終了するとIAdviseSink::OnCloseが、保存するとIAdviseSink::OnSaveが通知されます。 なお、アプリケーション毎に各通知のタイミングが異なっています。さまざまなOLEサーバで実験してみると面白いと思います。 例を挙げると、Excelではセルへのデータ入力が完了する毎に通知され、Wordではメニューから保存を選択する毎に通知されます。

Excelのキャプションに表示されているMicrosoft Excel - chap6 の ワークシートという文字列は、IOleObject.SetHostNamesを呼び出すことによって設定できます。 ただし、この文字列を使用するかどうかは、OLEサーバに任せられています。そのため、こういった文字列を表示しないOLEサーバも存在します。


3.まとめ

この外部アプリケーションを使用して、OLEファイルを編集することは、OLE1で既に実現されていました。 OLE2の設計は、OLE1の内容を取り込んでいるため、この編集方法が可能なのです。 ただし、これをサポートしないOLEサーバも存在しています。 代表的なものとしては、HTMLのOLEサーバが挙げられます。

このOLE1互換の編集機能をOLE1のアクティベーションと呼んだりします。 ただし、アクティベーションという単語は、OLE2になって始めて採用されたので、OLE2のアクティベーションに対して、そう呼んでいると言った方が適切かもしれません。 ちなみに、HTMLのOLEサーバは、OLE1のアクティベーションは不可能ですが、OLE2のアクティベーションは可能です。 このOLE2に独自のアクティベーションをインプレースアクティベーションと呼びます。 次回からは、このインプレースアクティベーションを主題に扱っていきます。


前へ 次へ
OLE on .NET Frameworkへ
総合トップへ