IStorage-Compound ファイルの実装

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

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

使用するタイミング

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

メソッド

IStorage::CreateStream

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

  • 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 で使用するために予約されています。 これは複合ファイルの制限であり、構造化ストレージの制限ではありません。 IStorage::OpenStorage メソッドの COM 提供の複合ファイルの実装では、次の動作はサポートされていません。

  • 非ルート ストレージの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の