Share via


IStorage-Compound ファイルの実装

IStorage の複合ファイル実装を使用すると、複合ファイル オブジェクトに存在するストレージ オブジェクト内にサブストレージとストリームを作成および管理できます。 複合ファイル オブジェクトを作成し、 IStorage ポインターを取得するには、API 関数 StgCreateStorageEx を呼び出します。 既存の複合ファイル オブジェクトを開き、そのルート IStorage ポインターを取得するには、 StgOpenStorageEx を呼び出します。

複合ストレージを使用するアプリケーションは、HKEY_CLASSES_ROOT\SystemFileAssociationsに登録し、独自のプロパティ ハンドラーを提供する必要があります。 詳細については、「アプリケーション登録」の「動詞とその他のファイル関連付け情報の 登録」セクションを参照してください。

使用するタイミング

ほとんどのアプリケーションでは、この実装を使用して、ストレージとストリームを作成および管理します。

メソッド

IStorage::CreateStream

このストレージ オブジェクトに含まれる指定した名前のストリーム オブジェクトを作成して開きます。 名前の長さは 31 文字以内にする必要があります (文字列終端記号は含まれません)。 ストリーム/ストレージ名の最初の文字として機能する 000 から 01f の文字は、OLE で使用するために予約されています。 これは複合ファイルの制限であり、構造化ストレージの制限ではありません。 COM が提供する IStorage::CreateStream メソッドの複合ファイル実装では、次の動作はサポートされていません。

  • STGM_DELETEONRELEASE フラグはサポートされていません。
  • トランザクション モード (STGM_TRANSACTED) は、ストリーム オブジェクトではサポートされていません。
  • 同じストレージから同じストリームを複数回開く操作はサポートされていません。 STGM_SHARE_EXCLUSIVE共有モード フラグは grfMode パラメーターで指定する必要があります。

IStorage::OpenStream

grfMode パラメーターで指定されたアクセス モードを使用して、このストレージ オブジェクト内の既存のストリーム オブジェクトを開きます。 ストリーム/ストレージ名の最初の文字として機能する 000 から 01f の文字は、OLE で使用するために予約されています。 これは複合ファイルの制限であり、構造化ストレージの制限ではありません。 IStorage::OpenStream メソッドの COM 提供の複合ファイル実装では、次の動作はサポートされていません。

  • STGM_DELETEONRELEASE フラグ。
  • ストリーム オブジェクトのトランザクション モード (STGM_TRANSACTED)。
  • 同じストレージから同じストリームを複数回開く。 STGM_SHARE_EXCLUSIVE フラグを指定する必要があります。

IStorage::CreateStorage

指定したアクセス モードで、指定した名前の新しいストレージ オブジェクトを作成して開きます。 名前の長さは 31 文字以内にする必要があります (文字列終端記号は含まれません)。 ストリーム/ストレージ名の最初の文字として機能する 000 から 01f の文字は、OLE で使用するために予約されています。 これは複合ファイルの制限であり、構造化ストレージの制限ではありません。 IStorage::CreateStorage メソッドの COM 提供の複合ファイル実装では、次の動作はサポートされていません。

  • 非ルート ストレージのSTGM_PRIORITY フラグ。
  • 同じ親ストレージから同じストレージ オブジェクトを複数回開く。 STGM_SHARE_EXCLUSIVE フラグを指定する必要があります。
  • STGM_DELETEONRELEASE フラグ。 このフラグを指定すると、関数は STG_E_INVALIDFLAGを返します。

IStorage::OpenStorage

指定したアクセス モードで、指定した名前の既存のストレージ オブジェクトを開きます。 ストリーム/ストレージ名の最初の文字として機能する 000 から 01f の文字は、OLE で使用するために予約されています。 これは複合ファイルの制限であり、構造化ストレージの制限ではありません。 COM が提供する IStorage::OpenStorage メソッドの複合ファイル実装では、次の動作はサポートされていません。

  • 非ルート ストレージのSTGM_PRIORITY フラグ。
  • 同じ親ストレージから同じストレージ オブジェクトを複数回開く。 STGM_SHARE_EXCLUSIVE フラグを指定する必要があります。
  • STGM_DELETEONRELEASE フラグ。 このフラグを指定すると、関数は STG_E_INVALIDFUNCTIONを返します。

IStorage::CopyTo

この開いているストレージ オブジェクトのサブストレージとストリームのみを別のストレージ オブジェクトにコピーします。 rgiidExclude パラメーターを IID_IStream に設定すると、サブストレージのみをコピーしたり、ストリームのみをコピー IID_IStorageしたりすることができます。

IStorage::MoveElementTo

このストレージ オブジェクトから別のストレージ オブジェクトにサブストレージまたはストリームをコピーまたは移動します。

IStorage::Commit

トランザクション モードで開いているストレージ オブジェクトに加えられた変更が、親ストレージに反映されるようにします。ルート ストレージの場合は、 は実際のデバイスの変更を反映します。たとえば、ディスク上のファイルなどです。 ダイレクト モードで開かれたルート ストレージ オブジェクトの場合、このメソッドは、すべてのメモリ バッファーをディスクにフラッシュする以外は効果がありません。 ダイレクト モードの非ルート ストレージ オブジェクトの場合、このメソッドは無効です。

com で提供される複合ファイルの実装では、 grfCommitFlags パラメーターでSTGC_OVERWRITEが指定されていない限り、2 フェーズ コミット プロセスが使用されます。 この 2 フェーズ プロセスにより、コミット操作が失敗した場合に備え、データの堅牢性が確保されます。 まず、新しいデータはすべて、基になるファイル内の未使用の領域に書き込まれます。 必要に応じて、新しい領域がファイルに割り当てられます。 この手順が完了すると、ファイル内のテーブルが単一セクターの書き込み操作を使用して更新され、新しいデータが古いデータの代わりに使用されることを示します。 古いデータは、次のコミット操作で使用される空き領域になります。 したがって、古いデータは使用可能であり、変更のコミット時にエラーが発生した場合に復元できます。 STGC_OVERWRITEを指定した場合は、単一フェーズのコミット操作が使用されます。 トランザクション モード フラグの詳細については、「 STGC 列挙型」を参照してください。

IStorage::Revert

最後のコミット操作以降にストレージ オブジェクトに対して行われたすべての変更を破棄します。

IStorage::EnumElements

このストレージ オブジェクト内に含まれるストレージ オブジェクトとストリーム オブジェクトを列挙するために使用できる列挙子オブジェクトへのポインターを作成および取得します。 COM で提供される複合ファイルの実装では、その情報のスナップショットを受け取ります。 そのため、新しい列挙子が取得されるまで、ストリームとストレージへの変更は列挙子に反映されません。

IStorage::D estroyElement

指定した要素 (サブストレージまたはストリーム) をこのストレージ オブジェクトから削除します。

IStorage::RenameElement

このストレージ オブジェクト内の指定されたサブストレージまたはストリームの名前を変更します。 ストリーム/ストレージ名の最初の文字として機能する 000 から 01f の文字は、OLE で使用するために予約されています。 これは複合ファイルの制限であり、構造化ストレージの制限ではありません。

IStorage::SetElementTimes

指定したストレージ要素の変更、アクセス、作成時間を設定します。 COM で提供される複合ファイルの実装では、内部ストレージ オブジェクトの変更と変更時間が維持されます。 ルート ストレージ オブジェクトは、基になるファイル システム (または ILockBytes) でサポートされているものをサポートします。 複合ファイルの実装では、内部ストリームのタイム スタンプは保持されません。 サポートされていないタイム スタンプは 0 として報告されます。これにより、呼び出し元はサポートをテストできます。

IStorage::SetClass

指定した CLSID をこのストレージ オブジェクトに割り当てます。

IStorage::SetStateBits

このストレージ オブジェクトに最大 32 ビットの状態情報を格納します。 このメソッドによって設定される状態は、外部でのみ使用されます。 COM で提供される複合ファイルの実装では、状態に基づくアクションは実行されません。

IStorage::Stat

この開いているストレージ オブジェクトの STATSTG 構造体を取得します。

解説

ストレージ オブジェクトが単純モードで開かれている場合は、上記のメソッドの使用が制限されます。 ストレージは、StgCreateStorageEx または StgOpenStorageEx 関数の grfMode パラメーターで指定されたSTGM_SIMPLE要素で開かれた場合単純モードになります。 簡易モード ストレージの詳細については、「 STGM 定数」を参照してください。 単純モードのストレージ オブジェクトが StgCreateStorageEx 関数から取得された場合は、 CreateStream メソッドを呼び出すことができますが、 OpenStream メソッドは呼び出すことができません。 単純モードのストレージ オブジェクトが StgOpenStorageEx 関数から取得された場合は、 OpenStream メソッドを呼び出すことができますが、 CreateStream メソッドを呼び出すことはできません。

単純モードのストレージ オブジェクトを使用してストリームを作成する場合、そのストリームの最小サイズは通常 4096 バイトです。 ストリームに書き込まれるデータが少ない場合、サイズは 4096 バイトに切り上げられます。

複合ファイルの実装の制限

IFillLockBytes

ILockBytes

IRootStorage

IStorage

IStream

StgCreateDocfile

StgCreateStorageEx

StgOpenStorage

StgOpenStorageEx