構造化ストレージ インターフェイス
構造化ストレージ サービスは、インターフェイスの 3 つのカテゴリに分類 されます。 各セットは、複合ファイル、それに含まれるオブジェクト、およびこれらの個々のコンポーネントが格納される物理メディアの間の間接参照または抽象化の連続したレベルを表します。
インターフェイスの最初のカテゴリは、 IStorage、 IStream、 および IRootStorage で構成されます。 最初の 2 つのインターフェイスは、複合ファイル内でのオブジェクトの格納方法を定義します。 これらのインターフェイスは、ストレージ要素を開く、変更をコミットおよび元に戻す、要素のコピーと移動、ストリームの読み取りと書き込みを行うメソッドを提供します。 これらのインターフェイスは、個々のオブジェクトのネイティブ データ形式を認識しないため、それらのオブジェクトを永続ストレージに保存する方法はありません。 IRootStorage インターフェイスには、複合ドキュメントを基になるファイル システム名に関連付ける 1 つのメソッドがあります。 クライアントは、複合ファイル用にこれらのインターフェイスを実装する必要があります。
インターフェイスの 2 番目のカテゴリは、永続データを管理するために オブジェクトが実装する IPersist インターフェイスで構成されます。 これらのインターフェイスは、個々のオブジェクトのデータ形式を読み取り、格納方法を知るメソッドを提供します。 クライアントは入れ子になったオブジェクトのネイティブ データ形式を認識しないため、これらのインターフェイスの実装はオブジェクトによって行われます。 ただし、これらのインターフェイスには、特定の物理ストレージ メディアに関する知識がありません。
3 番目のカテゴリは、ハード ディスクやテープ ドライブなどの特定の物理メディアにファイルを書き込むためのメソッドを提供する 1 つのインターフェイス ILockBytes で構成されます。 ただし、COM にはファイルベースの実装とメモリベースの実装という 2 つの最も一般的な状況の実装が既に用意されているため、ほとんどのアプリケーションでは ILockBytes インターフェイスは実装されません。 複合ファイル ストレージ オブジェクトは、実装で直接呼び出さない ILockBytes メソッドを呼び出します。
複合ファイルの実装の制限
構造化ストレージ アーキテクチャの COM 実装は、 複合ファイルと呼ばれます。 複合ファイルに実装されているストレージ オブジェクトには、 IPropertyStorage インターフェイスと IPropertySetStorage インターフェイスの実装が含まれます。
これらのインターフェイスの複合ファイル実装へのポインターは、 StgCreateStorageEx 関数を呼び出して新しい複合ファイル オブジェクトを作成するか、 StgOpenStorageEx を呼び出して以前に作成した複合ファイルを開くことで取得されます。
これらのインターフェイスの複合ファイル実装へのポインターを取得する別の方法は、古く、より制限された StgCreateDocfile または StgOpenStorage 関数を呼び出すことです。 4 つの関数はすべて、複合ファイルの実装として扱われます。
複合ファイルの実装は、 STGOPTIONS 構造体で定義されているように、512 バイトまたは 4096 バイトセクターを使用するように構成できます。
複合ファイルの複合ファイルの実装には、次の実装制約が適用されます。
制限 | 複合ファイル |
---|---|
ファイル サイズの制限: | 512: 2 ギガバイト (GB) 4096: ファイル システムの制限まで |
開いている要素に必要な最大ヒープ サイズ: | 512: 4 メガバイト (MB) 4096: 仮想メモリの上限まで |
同時実行ルートが開きます (同じファイルが開きます)。 | STGM_READとSTGM_SHARE_DENY_WRITEが指定されている場合、制限はファイル システムの制限によって決まります。 それ以外の場合は、同じファイルの同時ルートが 20 個開かれるという制限があります。 |
ファイル内の要素の数: | 512: 無制限ですが、4096 の要素数が無制限の場合、パフォーマンスが低下する可能性があります |
4 MB のヒープ サイズの制限により、トランザクション モードの開いている要素の数は通常、数千の要素に制限されます。