Chapter.17

構造化ストレージ(1)

2006/6/12
 ・ルートストレージの解説を追記。

1.現在のサンプルの問題点と今後の方針

現在のサンプルでは、OLEサーバの起動にOleCreateFromFileを使用しています。この関数の7番目のパラメータには、構造化ストレージを示すIStorageインターフェースへのポインタを渡さなければなりません。現時点では、このパラメータにはメモリ上に作成した一時的な構造化ストレージを渡していますが、これは本来のOLEの思想からは外れています。なぜならば、OLEは独自ドキュメントにオブジェクトを埋め込み、リンクするために開発されたにも関わらず、サンプルでは埋め込まれる側のオブジェクト(OleCreateFromFileでロードされるOLEファイル)の表示と操作を主目的としているからです。(まあ、これはコンテンツの構成上仕方のないことですが・・・)
思想から外れているだけなら特に問題とはなりませんが、リンクやクリップボード等のOLEの高度な機能を扱おうとすると、それが足かせとなり、サンプルを作成することが難しくなってしまいます。

それら問題を解決するため、既存のサンプルに構造化ストレージを使用する独自ドキュメントを実装することにします。それに先立って、しばらくは構造化ストレージの使用方法について解説を進めていきたいと思います。


2.構造化ストレージ

すでに何回も出てきていますが、構造化ストレージとは、ファイルシステムのような階層構造を持つデータを操作するために用意された、COM/OLEの機能の一つです。構造化ストレージには、ファイルシステムにおけるフォルダとファイルの関係のように、ストレージストリームという二つの構成要素があります。それぞれ、ストレージはフォルダに相当し、ストリームはファイルに相当します。また、Windowsのファイルシステムにはフォルダのルートとしてドライブがありますが、構造化ストレージにおいては、ドライブに相当するストレージをルートストレージと呼びます。

ストレージの操作には、IStorageインターフェースを使用し、ストリームの操作にはIStreamインターフェースを使用します。このうち、IStreamは、.NET Framework上でSystem.Runtime.InteropServices.UCOMIStreamと定義されています。そのため、IStorageを.NET Framework用に定義すれば、構造化ストレージの操作が可能となります。なお、前章までのサンプルの中に、IStorageの定義は含まれています。

構造化ストレージを使用するためには、OLEのAPIを使用して構造化ストレージオブジェクトのインスタンスを作成する必要があります。構造化ストレージのインスタンスを作成するAPIを次の表に示します。
API 概要 備考
StgCreateDocfile 構造化ストレージオブジェクトをファイルとして新規に作成します。  
StgCreateDocfileOnILockBytes 構造化ストレージオブジェクトをユーザー定義のバイト配列オブジェクト(ILockBytesインターフェース)上に作成します。  
StgCreateStorageEx 構造化ストレージオブジェクトをファイルとして新規に作成します。StgCreateDocfileよりも高機能です。 Windows2000以降のみ使用可能。9x系は使用不可。
StgOpenAsyncDocfileOnIFillLockBytes 構造化ストレージオブジェクトを非同期バイト配列オブジェクト(IFillLockBytesインターフェース)を使用して開きます。 WindowsNT4.0以前のみ使用可能。9x系でも使用可能。
StgOpenLayoutDocfile 保存された構造化ストレージファイルをオープンします。このAPIでオープンされた構造化ストレージファイルは階層構造を任意にレイアウトすることが可能となります。  
StgOpenStorage 保存された構造化ストレージファイルをオープンします。  
StgOpenStorageEx 保存された構造化ストレージファイルをオープンします。StgOpenStorageよりも高機能です。 Windows2000以降のみ使用可能。9x系は使用不可。
StgOpenStorageOnILockBytes ユーザー定義のバイト配列オブジェクト(ILockBytesインターフェース)に読み込まれたデータから構造化ストレージオブジェクトをオープンします。  
これらAPIで直接取得した構造化ストレージオブジェクトのインスタンスがルートストレージになります。

今回のサンプルは構造化ストレージの階層構造を読み取りコンソール画面にダンプするプログラムです。構造化ストレージファイルを読み込むため、使用頻度の高いStgOpenStorageを使用しています。下がサンプルソースです。VB.NETとC#用のソースをそれぞれ用意しています。

VB.NETサンプルソース:chap17.vb.lzh(26KB 2005/2/8)
C#サンプルソース:chap17.cs.lzh(26KB 2005/2/8)


3.まとめ

とりあえず、ずっと放置していた構造化ストレージの解説に入りました。可能な限り多くの内容を扱って行きたいので、構造化ストレージの解説が、長く続くかもしれません。まあ、気長に見守ってやって下さい。

今回のサンプルでは、IStreamを使用するところで苦労している箇所がありますが、これはSystem.Runtime.InteropServices.UCOMIStreamの問題と言えます。この.NET Frameworkで定義されたインターフェースを使用する場合、C#ではunsafeコードによるポインタを使用すると実装が楽になります。現時点では、サンプルがVB.NETを基本としているので、unsafeコードによる使用方法を解説する予定はありません。


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