Chapter.21

埋め込みコンテナ(1)


1.埋め込みコンテナへの道

今回から完全な埋め込みコンテナの実装を解説して行こうと思います。
オブジェクトの埋め込みとは、ドキュメントにオブジェクトを埋め込むことですが、今までの章ではオブジェクトが埋め込まれるドキュメントについては全く解説してきませんでした。これは構造化ストレージの解説を可能な限り後回しにした結果です。構造化ストレージの解説は既に完了しているので、インプレースアクティベーション可能なアプリケーションを提示しようかと思いましたが、それでは解説するべき内容が膨大になってしまうため、少しずつ解説して行きたいと思います。


2.ストレージCLSID

OLEドキュメントを扱うアプリケーションのほとんどは、構造化ストレージファイルにデータを保存します。構造化ストレージファイルのフォーマットは共通であるため、各アプリケーションは自分が扱う構造化ストレージファイルを識別するためにファイルの先頭にマジックナンバーを埋め込むような方法を使用することはできません。また、サブストレージやサブストリームの構成からファイルを判断するのは、パフォーマンスや実装に掛かるコストの点で問題となる可能性があります。
IStorageインターフェースには、この問題を解決するためSetClassというメソッドが用意されています。SetClassメソッドはストレージを扱うアプリケーションを識別するためのCLSIDをストレージに設定します。

独自の構造化ストレージファイルを扱うサンプルソースをVB.NETとC#で用意しました。

VB.NETサンプルソース:chap21.vb.lzh (31KB 2007/6/5)
C#サンプルソース:chap21.cs.lzh (32KB 2007/6/5)

サンプルは単純なドロー系のアプリケーションです。フォーム上でマウス操作した箇所に線を描画し、そのベクトルデータをCONTENTSというストリームに保存しています。時代に逆行してMDIアプリケーションとして実装しています。このサンプルではオブジェクトのリンクと埋め込みに関する実装はまったく行っていませんが、この章以降の実装を考えた上でモジュールの分割を行っています。


3.まとめ

あえて、まとめる必要もありませんが・・・
・ストレージを扱うアプリケーションを識別するためにはCLSIDをストレージに設定すること
と言ったところでしょうか。ルートストレージに設定するCLSIDは実際のところ、アプリケーションがユーザーの選択したファイルを扱えるかどうかを識別する、以外に重要な意味を持ちません。それとは異なり、サブストレージのCLSIDは埋め込んだオブジェクトを扱うサーバを自動的に識別するために重要となります。それらの詳細は次回に述べることにします。(多分・・・)

OLEは「オブジェクトのリンクと埋め込み」と日本語に訳せると、トップページに記してから6年経ってようやくオブジェクトの埋め込みについて解説し始めることになるとは、当時は思いもしなかっただろうなぁ・・・


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

サンプルで使用しているキーワード
IRootStorage IStorage IStream StgCreateDocfile StgOpenStorage