Chapter.3
IOleObjectの役割
2004/6/15
・段落構成の採用とそれに伴う文章の見直し。
2004/6/16
・IOleObjectの各メソッドの説明を修正。
2004/6/17
・ソースのMarshal.BindToMonikerの呼び出し部分がコメントになっていたのを条件付コンパイルに変更。
2004/6/24
・サンプルソースで、構造体変数をNewで初期化しているものをNewしないように修正。
1.OLEサーバのアーキテクチャ
OLEサーバの設計は、MFCのドキュメント/ビュー アーキテクチャよりも、MVC(モデル/ビュー/コントローラ)アーキテクチャに近いように感じます。
簡単に下表にまとめてみました。
| アーキテクチャ |
対応するインターフェース |
MFCと対応づけると・・・ |
| M/モデル |
IDataObject |
ドキュメント |
| V/ビュー |
IViewObject |
ビュー |
| C/コントローラ |
IOleObject |
しかし、実際にはOLEサーバのインターフェースは、MVCアーキテクチャに従って設計されているわけではありません。
設計の結果、MVCアーキテクチャに近くなったというだけの話です。この辺の話は、InsideOLE(改訂新版)に詳しく載ってた気がします。
OLE1の最大の欠点であったデータ転送の難点を克服するために設計されたIDataObject。
デバイスを依存することなく描画を実現するために設計されたIViewObject。
そして、それらを制御するためのIOleObject・・・。
と、なっていたら素晴らしい設計なのですが、実際にはそうではありません。IOleObjectには、
OLEサーバを操作(ユーザーとプログラムの両方から)する上で、IDataObjectとIViewObjectに含めるのに適していない機能の全てを詰め込んだらしいです。
結果的に、MVCアーキテクチャに似てしまったというだけの話のようです。う〜む・・・。まあ、よく練りこまれた設計思想と言えなくも無い気がしないでもないですね?
2.コントローラインターフェースのテスト
この章では、MVCではコントローラに相当するIOleObjectが持っている一部のメソッドを紹介してみようと思います。
そのため、それらをテストする機能を前回のプログラムに追加します。
ただし、動作に影響の出る機能や、以降の章で解説しようと思っているところに関しては組み込んでいません。
また、IDataObjectのあまり使われない機能もテストできるようにしてみました。
VB.NETサンプルソース:chap3.vb.lzh(22KB未満 2004/06/24)
追加部分
下のハードコピーはアプリケーションにいつものExcelファイルを読み込ませたところです。メニューが追加されているのが分かるかと思います。

IOleObject.EnumVerbs
下のハードコピーはIOleObject.EnumVerbsを呼び出した結果をフォーマットしたものです。

このメソッドは、その名の通りVerbを列挙します。
Verbとは、本では「主動詞」等と翻訳されていたりしますが、
最も適切な日本語訳は、「OLEサーバに備わっている機能」のことです。
つまり、このハードコピーでは、OLEサーバに機能が2つあることを示します。
IOleObject.Update
下のハードコピーはIOleObject.Updateの呼び出し結果です。

このメソッドは、主にオブジェクトのリンクで使用されるため、この章では詳細な説明は割愛します。
IOleObject.IsUpToDate
下のハードコピーはIOleObject.IsUpToDateの呼び出し結果です。

このメソッドは、主にオブジェクトのリンクで使用されるため、この章では詳細な説明は割愛します。
ちなみに、非リンクオブジェクト(今回が正にそうである)の場合に、
このメソッドがS_OKを返却し続けるOLEサーバが存在しますが、その動作が仕様に準拠しているかどうかは微妙なところです。
少なくともクライアント思いなOLEサーバではないと言えます。
IOleObject.GetUserClassID
下のハードコピーはIOleObject.GetUserClassIDの呼び出し結果です。

このメソッドは、OLEサーバのCLSIDを返却します。図の例では、これはExcel.Sheet.8を示すものになっています。
IOleObject.GetUserType
下のハードコピーはIOleObject.GetUserTypeの呼び出し結果です。

このメソッドは、人間が理解できる言葉でOLEサーバの説明文を取得します。
IOleObject.GetExtent
下のハードコピーはIOleObject.GetExtentの呼び出し結果です。

このメソッドは、OLEサーバのエクステント(範囲と翻訳するか・・・)を取得します。
これはOLEサーバのサイズとほぼ同意です。ただし、ピクセル単位ではないため、インプレースアクティベーションを行った場合のウィンドウサイズとは異なった値になります。
エクステントに関しては第5章で解説(予定)。インプレースアクティベーションは、ずっと後の章で解説します。
IOleObject.GetMiscStatus
下のハードコピーはIOleObject.GetMiscStatusの呼び出し結果です。

このメソッドは、OLEサーバの動作に関する状態を取得します。
それは時間経過によって変化する揮発的な状態を表すものではなく、
OLEサーバ固有で不変な状態を示します。そのため、この値はレジストリに格納されることが良くあります。
IDataObject.EnumFormatEtc
下のハードコピーはIDataObject.EnumFormatEtcの呼び出し結果をフォーマットしたものです。

ただ1つIOleObjectのメソッドではありません。
これは、OLEサーバで扱うことの出来るIDataObjectの種類を取得します。
Excelは膨大な種類のデータを扱うことが出来るようです。
3.その他の変更点&まとめ
今後のことも考えて、オブジェクトの開放も実装してあります。IOleObject.Closeは、この開放処理に組み込んであります。
また、リサイズ時に再描画されない問題も解決してみました。
IOleObjectの各メソッドは、解説するだけで1ページ使うぐらいのボリュームになってしまいます。
なので、今は、パラメータと結果だけ見ておけばいいかな、と思います。
いろいろなOLEサーバに対して、このチェックを行って見てください。この基本部分でさえ、各OLEサーバの独自色が見えてくると思います。
明らかに仕様に準拠していない物や、パフォーマンスの点で不利な物など・・・。
参考程度に私がテストした拡張子を列挙しておきます。
| 拡張子 |
説明 |
| xls |
Microsoft Excel ワークシート |
| doc |
Microsoft Word 文書 |
| ppt |
Microsoft PowerPoint 文書 |
| vsd |
Microsoft Visio 文書 |
| bmp |
ビットマップイメージ |
| gif |
GIFイメージ |
| jpg |
JPEGイメージ |
| html |
HTML 文書 |
| pdf |
Adobe Acrobat 文書 |
| xdw |
Fuji Xerox DocuWorks文書 |
といったところでしょうか。
ビットマップのOLEサーバも性能が高くて扱いやすいと思います。しかも、データを用意しやすいという利点もあります。
HTMLはなぜか表示されません。IDataObject.EnumFormatEtcの結果を見る限り、METAFILEPICT形式を扱えるようなのですが・・・。
あと面白いと思ったのは、標準ではないIOleObject.EnumVerbsの結果を返すDocuWorks文書が挙げられます。
これはアプリケーション自体を手に入れる機会が少ないと思いますので、その結果を掲載しておきます。

これでIOleObjectの最初の解説を終了しますが、その役割を理解して頂けたでしょうか?
なお、IOleObjectは今後もずっと使いつづけるので、ここで理解できなくても問題はありません。
先ほど書いたように、どのメソッドがどう動作するかを知ってもらえば十分です。
前へ 次へ
OLE on .NET Frameworkへ
総合トップへ