Structured StorageFundamentalsStructured Storage Interfaces

構造化ストレージインタフェース

構造化ストレージのサービスは、インタフェースの 3つのカテゴリに組織化されます。

それぞれのカテゴリは、複合ファイル、それに含まれるオブジェクト、そしてそれら個々のコンポーネントが保存される物理メディア間の、連続した間接的/抽象的な層を表現します。

  1. 最初のカテゴリに属するインタフェースには、IStorageIStreamIRootStorage があります。

    最初の 2つのインタフェースは、オブジェクトが複合ファイルにどのようにして格納されるかを定義します。

    これらのインタフェースは、ストレージを開いたり、変更を確定や破棄し、エレメントを複写や移動し、ストリームの読み書きをおこないます。

    これらのインタフェースは、個々のオブジェクトに固有のデータ形式を知りません。 そのため、これらのオブジェクトを恒久的なストレージに保存するメソッドを持ちません。

    IRootStorage インタフェースは唯一、複合ドキュメントをその基礎となるファイルシステムでの名前に関連付けるメソッドを持ちます。

    クライアントは自身の複合ファイルのために、これらのインタフェースを実装する責任を持ちます。

  2. 2つ目のカテゴリに属するインタフェースには、IPersist インタフェースがあります。 このオブジェクトは、その永続的なデータを管理するために実装されます。

    これらのインタフェースは、個々のオブジェクトのデータ形式を読み取るメソッドを提供します。 そのため、このインタフェースはどのようにそれらを格納するのかを知っています。

    オブジェクトは、クライアントがそれらのネストしたオブジェクトの固有のデータ形式を知らないため、これらのインタフェースを実装する責任があります。

    しかし、これらのインタフェースは物理ストレージメディアに関する特別な知識はもっていません。

  3. 3つ目のカテゴリに属するインタフェースには、ILockBytes インタフェースひとつだけがあります。 このオブジェクトは、ハードディスクやテープドライブなどの特定の物理メディアにファイルを書き込むメソッドを提供します。

    しかし、二つのよくある条件のために COM が既に提供している実装があるため、ほとんどのアプリケーションでは ILockBytes インタフェースを実装しません。 それはファイルベースの実装と、メモリベースの実装です。 複合ファイルのストレージオブジェクトは ILockBytes のメソッドを呼び出すため、直接実装を呼び出しません。

複合ファイル実装の制限

構造化ストレージアーキテクチャの COM による実装は、複合ファイルと呼ばれます。 複合ファイルでのストレージオブジェクトの実装は、IPropertyStorageIPropertySetStorage インタフェースを含みます。

複合ファイル実装でのこれらのインタフェースポインタは、StgCreateStorageEx() 関数で新しい複合ファイルオブジェクトを作成したり、StgOpenStorageEx() で以前に作成された複合ファイルを開くことで取得します。

複合ファイル実装でこれらのインタフェースポインタを取得する代わりの方法として、古くて制限の多い StgCreateDocfile()StgOpenStorage() 関数を呼び出すことができます。 これらの 4つの関数は、複合ファイル実装としてあつかわれます。

複合ファイル実装では、セクタサイズを 512 か 4096 バイトのどちらで使用するか選択できます。 これは STGOPTIONS 構造体で定義します。

複合ファイルの実装には、以下の実装による制約があります。

制限 512 byte 4096 byte
ファイルサイズ 2GB ファイルシステムの上限
エレメントを開くために要求される最大ヒープサイズ 4MB 仮想メモリの上限
ルートの並行オープン(同じファイルを開く) STGM.ReadSTGM.ShareDenyWrite が指定されていれば、上限はファイルシステムによって決定されます。
それ以外の場合、同じファイルのルートを並行して開けるのは、20までです。
1ファイル内のエレメント数 無制限
ただし、エレメント数が 1000を超えるとパフォーマンスが低下する。
無制限

ヒープサイズ 4MB 制限のため、トランザクションモードで開けるエレメントの数は、大概数千までに制限されます。