Win32 API 日本語リファレンス
ホームSystem.Com.StructuredStorage › IStorage

IStorage

COM
IID0000000b-0000-0000-c000-000000000046継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IStorage インターフェースは、構造化ストレージオブジェクトの作成と管理をサポートします。

メソッド 15

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT CreateStream(LPWSTR pwcsName, STGM grfMode, DWORD reserved1, DWORD reserved2, IStream** ppstm)

このストレージオブジェクトに含まれる、指定した名前のストリームオブジェクトを作成して開きます。

pwcsNameLPWSTRin新しく作成するストリームの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。この名前は、後でストリームを開いたり再度開いたりするために使用できます。名前の長さは、文字列終端文字を含めずに 31 文字を超えてはなりません。ストリーム/ストレージ名の先頭文字となる 000 から 01f までの文字は、OLE による使用のために予約されています。これは複合ファイルの制限であり、構造化ストレージの制限ではありません。
grfModeSTGMin新しく作成したストリームを開くときに使用するアクセスモードを指定します。詳細と指定可能な値の説明については、STGM Constants を参照してください。
reserved1DWORDin将来の使用のために予約されています。ゼロを指定する必要があります。
reserved2DWORDin将来の使用のために予約されています。ゼロを指定する必要があります。
ppstmIStream**out戻り値として、新しい IStream インターフェースポインターの格納場所へのポインター。これは操作が成功した場合にのみ有効です。エラーが発生した場合、このパラメーターには NULL が設定されます。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK 新しいストリームが正常に作成されました。
E_PENDING 非同期ストレージのみ: 必要なデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED ストリームを作成するための権限が不足しています。
STG_E_FILEALREADYEXISTS ストリームに指定した名前がストレージオブジェクト内に既に存在し、grfMode パラメーターに値 STGM_FAILIFTHERE が含まれています。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、ストリームは作成されませんでした。
STG_E_INVALIDFLAG grfMode パラメーターに指定した値が、有効な STGM 定数値ではありません。
STG_E_INVALIDFUNCTION grfMode パラメーターに指定されたフラグの組み合わせがサポートされていません。たとえば、STGM_SHARE_EXCLUSIVE フラグを指定せずにこのメソッドを呼び出した場合などです。
STG_E_INVALIDNAME pwcsName の値が無効です。
STG_E_INVALIDPOINTER ストリームオブジェクトに指定したポインターが無効でした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、ストリームは作成されませんでした。

解説(Remarks)

pwcsName パラメーターに指定した名前のストリームが既に存在し、grfMode パラメーターに STGM_CREATE フラグが含まれている場合、既存のストリームは新しく作成されたストリームに置き換えられます。古いストリームの破棄と新しいストリームオブジェクトの作成はいずれも、親ストレージオブジェクトのトランザクションモードの対象となります。

COM が提供する複合ファイル実装の IStorage::CreateStream メソッドは、次の動作をサポートしていません。

ストリームが既に存在し、grfModeSTGM_FAILIFTHERE が設定されている場合、このメソッドは戻り値 STG_E_FILEALREADYEXISTS で失敗します。
vtbl 4 HRESULT OpenStream(LPWSTR pwcsName, void* reserved1, STGM grfMode, DWORD reserved2, IStream** ppstm)

このストレージオブジェクト内の既存のストリームオブジェクトを、指定したアクセスモードで開きます。

pwcsNameLPWSTRin開くストリームの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。ストリーム/ストレージ名の先頭文字となる 000 から 01f までの文字は、OLE による使用のために予約されています。これは複合ファイルの制限であり、構造化ストレージの制限ではありません。
reserved1void*optional将来の使用のために予約されています。NULL を指定する必要があります。
grfModeSTGMin開いたストリームに割り当てるアクセスモードを指定します。詳細と指定可能な値の説明については、STGM Constants を参照してください。複合ファイル実装でこのメソッドを呼び出す場合、選択するその他のモードは、少なくとも STGM_SHARE_EXCLUSIVE を指定する必要があります。
reserved2DWORDin将来の使用のために予約されています。ゼロを指定する必要があります。
ppstmIStream**out新しく開いたストリームオブジェクトへのインターフェースポインターを受け取る、 IStream ポインター変数へのポインター。エラーが発生した場合、*ppstm には NULL が設定されます。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK ストリームが正常に開かれました。
E_PENDING 非同期ストレージのみ: ストリームデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED ストリームを開くための権限が不足しています。
STG_E_FILENOTFOUND 指定した名前のストリームが存在しません。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、ストリームは開かれませんでした。
STG_E_INVALIDFLAG grfMode パラメーターに指定した値が、有効な STGM 定数値ではありません。
STG_E_INVALIDFUNCTION grfMode パラメーターに指定されたフラグの組み合わせがサポートされていません。たとえば、STGM_SHARE_EXCLUSIVE フラグを指定せずにこのメソッドを呼び出した場合などです。
STG_E_INVALIDNAME pwcsName の値が無効です。
STG_E_INVALIDPOINTER ストリームオブジェクトに指定したポインターが無効でした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、ストリームは開かれませんでした。

解説(Remarks)

IStorage::OpenStream は、このストレージオブジェクト内の既存のストリームオブジェクトを、grfMode で指定したアクセスモードで開きます。grfMode に指定できる権限には制限があります。たとえば、このストレージオブジェクトの権限は、そのストリームの権限を制限します。一般に、ストリームに対するアクセス制限は、その親ストレージに対する制限よりも厳しくする必要があります。複合ファイルのストリームは STGM_SHARE_EXCLUSIVE を指定して開く必要があります。

vtbl 5 HRESULT CreateStorage(LPWSTR pwcsName, STGM grfMode, DWORD reserved1, DWORD reserved2, IStorage** ppstg)

指定した名前で、指定したアクセスモードにより、このストレージオブジェクト内にネストされる新しいストレージオブジェクトを作成して開きます。

pwcsNameLPWSTRin新しく作成するストレージオブジェクトの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。この名前は、後でストレージオブジェクトを再度開くために使用できます。名前の長さは、文字列終端文字を含めずに 31 文字を超えてはなりません。ストリーム/ストレージ名の先頭文字となる 000 から 01f までの文字は、OLE による使用のために予約されています。これは複合ファイルの制限であり、構造化ストレージの制限ではありません。
grfModeSTGMin新しく作成したストレージオブジェクトを開くときに使用するアクセスモードを指定する値。詳細と指定可能な値の説明については、STGM Constants を参照してください。
reserved1DWORDin将来の使用のために予約されています。ゼロを指定する必要があります。
reserved2DWORDin将来の使用のために予約されています。ゼロを指定する必要があります。
ppstgIStorage**out成功した場合、新しく作成したストレージオブジェクトへの IStorage ポインターの格納場所へのポインター。エラーが発生した場合、このパラメーターには NULL が設定されます。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK ストレージオブジェクトが正常に作成されました。
E_PENDING 非同期ストレージのみ: 必要なデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED ストレージオブジェクトを作成するための権限が不足しています。
STG_E_FILEALREADYEXISTS ストレージオブジェクトに指定した名前がストレージオブジェクト内に既に存在し、grfMode パラメーターにフラグ STGM_FAILIFTHERE が含まれています。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、ストレージオブジェクトは作成されませんでした。
STG_E_INVALIDFLAG grfMode< パラメーターに指定した値が、有効な STGM 定数値ではありません。
STG_E_INVALIDFUNCTION grfMode パラメーターに指定されたフラグの組み合わせがサポートされていません。
STG_E_INVALIDNAME pwcsName の値が無効です。
STG_E_INVALIDPOINTER ストレージオブジェクトに指定したポインターが無効でした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、ストレージオブジェクトは作成されませんでした。
STG_S_CONVERTED 指定した名前の既存のストリームが、CONTENTS という単一のストリームを含む新しいストレージオブジェクトに置き換えられました。新しいストレージオブジェクトが追加されます。

解説(Remarks)

pwcsName パラメーターに指定した名前のストレージが親ストレージオブジェクト内に既に存在し、grfMode パラメーターに STGM_CREATE フラグが含まれている場合、既存のストレージは新しいストレージに置き換えられます。grfMode パラメーターに STGM_CONVERT フラグが含まれている場合、既存の要素は CONTENTS という名前のストリームオブジェクトに変換され、その CONTENTS ストリームオブジェクトを含む新しいストレージオブジェクトが作成されます。古い要素の破棄と新しいストレージオブジェクトの作成はいずれも、親ストレージオブジェクトのトランザクションモードの対象となります。STGM_CREATE を使用している場合は STGM_CONVERT を使用できない点に注意してください。

COM が提供する複合ファイル実装の IStorage::CreateStorage メソッドは、次の動作をサポートしていません。

同じ名前のストレージオブジェクトが既に存在し、grfModeSTGM_FAILIFTHERE が設定されている場合、このメソッドは戻り値 STG_E_FILEALREADYEXISTS で失敗します。
vtbl 6 HRESULT OpenStorage(LPWSTR pwcsName, IStorage* pstgPriority, STGM grfMode, WORD** snbExclude, DWORD reserved, IStorage** ppstg)

指定した名前の既存のストレージオブジェクトを、指定したアクセスモードで開きます。

pwcsNameLPWSTRin開くストレージオブジェクトの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。ストリーム/ストレージ名の先頭文字となる 000 から 01f までの文字は、OLE による使用のために予約されています。これは複合ファイルの制限であり、構造化ストレージの制限ではありません。pstgPriority が非 NULL の場合、これは無視されます。
pstgPriorityIStorage*inNULL を指定する必要があります。非 NULL の値を指定すると STG_E_INVALIDPARAMETER が返されます。
grfModeSTGMinストレージオブジェクトを開くときに使用するアクセスモードを指定します。指定可能な値の説明については、STGM Constants を参照してください。このメソッドを呼び出す際、選択するその他のモードは、少なくとも STGM_SHARE_EXCLUSIVE を指定する必要があります。
snbExcludeWORD**inNULL を指定する必要があります。非 NULL の値を指定すると STG_E_INVALIDPARAMETER が返されます。
reservedDWORDin将来の使用のために予約されています。ゼロを指定する必要があります。
ppstgIStorage**out成功した場合、開いたストレージオブジェクトへの IStorage ポインターの格納場所へのポインター。エラーが発生した場合、このパラメーターには NULL が設定されます。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK ストレージオブジェクトが正常に開かれました。
E_PENDING 非同期ストレージのみ: ストレージのデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED ストレージオブジェクトを開くための権限が不足しています。
STG_E_FILENOTFOUND 指定した名前のストレージオブジェクトが存在しません。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、ストレージオブジェクトは開かれませんでした。
STG_E_INVALIDFLAG grfMode パラメーターに指定した値が、有効な STGM 定数値ではありません。
STG_E_INVALIDFUNCTION grfMode パラメーターに指定されたフラグの組み合わせがサポートされていません。
STG_E_INVALIDNAME pwcsName の値が無効です。
STG_E_INVALIDPOINTER ストレージオブジェクトに指定したポインターが無効でした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、ストレージオブジェクトは作成されませんでした。
STG_S_CONVERTED 指定した名前の既存のストリームが、CONTENTS という単一のストリームを含む新しいストレージオブジェクトに置き換えられました。ダイレクトモードでは、新しいストレージはただちにディスクに書き込まれます。トランザクションモードでは、新しいストレージはメモリ内の一時ストレージに書き込まれ、後でコミットされたときにディスクに書き込まれます。

解説(Remarks)

pstgPriority パラメーターが NULL の場合、無視されます。pstgPriority パラメーターが NULL でない場合、それはストレージオブジェクトの要素を以前に開いたもの(通常は優先モードで開いたもの)への IStorage ポインターです。そのストレージオブジェクトを閉じ、grfMode に従って再度開く必要があります。IStorage::OpenStorage メソッドが戻ると、pstgPriority は無効になります。ppstg パラメーターで提供された値を使用してください。

ストレージオブジェクトは STGM_DELETEONRELEASE を指定して開くことができます。その場合、オブジェクトは最後の解放(release)を受け取ったときに破棄されます。これは一時的なストレージオブジェクトの作成に役立ちます。

vtbl 7 HRESULT CopyTo(DWORD ciidExclude, GUID* rgiidExclude, WORD** snbExclude, IStorage* pstgDest)

開いているストレージオブジェクトの内容全体を、別のストレージオブジェクトにコピーします。

ciidExcludeDWORDinrgiidExclude が指す配列内の要素数。rgiidExcludeNULL の場合、ciidExclude は無視されます。
rgiidExcludeGUID*inoptionalインターフェース識別子(IID)の配列。呼び出し元が把握していてコピーしたくないインターフェース、またはストレージオブジェクトがサポートしていないが呼び出し元が後で明示的にその状態をコピーするインターフェースを指定します。この配列には IStorage(ストリームオブジェクトのみをコピーすることを示す)や IStream(ストレージオブジェクトのみをコピーすることを示す)を含めることができます。配列の長さがゼロの場合、 IStorage オブジェクトが公開する状態のみがコピーされ、オブジェクト上のその他のすべてのインターフェースは無視されます。NULL を渡した場合、オブジェクト上のすべてのインターフェースがコピーされます。
snbExcludeWORD**inoptionalコピー先にコピーしないストレージオブジェクトまたはストリームオブジェクトのブロックを指定する文字列名ブロック( SNB を参照)。これらの要素はコピー先には作成されません。rgiidExclude 配列に IID_IStorage が含まれている場合、このパラメーターは無視されます。このパラメーターは NULL でもかまいません。
pstgDestIStorage*inこのストレージオブジェクトのコピー先となる、開いているストレージオブジェクトへのポインター。コピー先のストレージオブジェクトは、コピー元のストレージオブジェクトとは異なる IStorage インターフェースの実装であってもかまいません。そのため、IStorage::CopyTo はコピー先のストレージオブジェクトの公開されているメソッドのみを使用できます。pstgDest がトランザクションモードで開かれている場合は、その IStorage::Revert メソッドを呼び出すことで復帰(revert)できます。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK ストレージオブジェクトが正常にコピーされました。
E_PENDING 非同期ストレージのみ: コピーするデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED コピー先のストレージオブジェクトがコピー元のストレージオブジェクトの子です。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、コピーは完了しませんでした。
STG_E_INVALIDPOINTER ストレージオブジェクトに指定したポインターが無効でした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、コピーは完了しませんでした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。
STG_E_MEDIUMFULL 記憶媒体がいっぱいのため、コピーは完了しませんでした。

解説(Remarks)

このメソッドは、コピー元のストレージオブジェクトに含まれる要素を、コピー先に既に存在する要素とマージします。コピー先のストレージオブジェクトのレイアウトは、コピー元のストレージオブジェクトと異なる場合があります。

コピー処理は再帰的であり、コピー元の内部にネストされた要素に対して IStorage::CopyToIStream::CopyTo を呼び出します。

同じ名前の既存のストリームに上書きする形でストリームをコピーする場合、既存のストリームはまず削除され、その後コピー元のストリームに置き換えられます。同じ名前の既存のストレージに上書きする形でストレージをコピーする場合、既存のストレージは削除されません。そのため、コピー操作の後、コピー先の IStorage には、同じ名前の新しい要素で置き換えられなかった古い要素が残ります。

ストレージオブジェクトは、 IStorage 以外にも、 IRootStorageIPropertyStorageIPropertySetStorage などのインターフェースを公開する場合があります。rgiidExclude パラメーターを使用すると、これらの追加インターフェースの一部またはすべてをコピー操作から除外できます。

既存のサブストレージまたはストリームオブジェクトのより新しい、あるいはより効率的なコピーを持つ呼び出し元は、これらのオブジェクトの現在のバージョンをコピー操作から除外したい場合があります。snbExclude パラメーターと rgiidExclude パラメーターは、ストレージオブジェクトの既存のストレージまたはストリームを除外する 2 つの方法を提供します。

呼び出し元への注意

IStorage::CopyTo メソッドの最も一般的な使い方は、ほとんどの完全保存(フルセーブ)や名前を付けて保存の操作のように、コピー元からコピー先へすべてをコピーすることです。

次のサンプルコードは、コピー元のストレージオブジェクトからコピー先のストレージオブジェクトへすべてをコピーする方法を示しています。

pstg->CopyTo(0, Null, Null, pstgDest)
Note ドキュメントファイルを圧縮(コンパクト化)するには、ルートストレージオブジェクトに対して CopyTo を呼び出し、新しいストレージオブジェクトにコピーします。
vtbl 8 HRESULT MoveElementTo(LPWSTR pwcsName, IStorage* pstgDest, LPWSTR pwcsNewName, DWORD grfFlags)

MoveElementTo メソッドは、サブストレージまたはストリームを、このストレージオブジェクトから別のストレージオブジェクトへコピーまたは移動します。

pwcsNameLPWSTRinこのストレージオブジェクト内で移動またはコピーする要素の名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。
pstgDestIStorage*inコピー先のストレージオブジェクトへの IStorage ポインター。
pwcsNewNameLPWSTRin新しいストレージオブジェクト内での要素の新しい名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。
grfFlagsDWORDin操作を移動(STGMOVE_MOVE)にするかコピー(STGMOVE_COPY)にするかを指定します。 STGMOVE 列挙型を参照してください。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK ストレージオブジェクトが正常にコピーまたは移動されました。
E_PENDING 非同期ストレージのみ: 要素のデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED コピー先のストレージオブジェクトがコピー元のストレージオブジェクトの子です。または、コピー先のオブジェクトと要素名がコピー元のオブジェクトと要素名と同じです。つまり、要素を自分自身に移動することはできません。
STG_E_FILENOTFOUND 指定した名前の要素が存在しません。
STG_E_FILEALREADYEXISTS 指定したファイルは既に存在します。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、コピーまたは移動は完了しませんでした。
STG_E_INVALIDFLAG grfFlags パラメーターの値が無効です。
STG_E_INVALIDNAME pwcsName の値が無効です。
STG_E_INVALIDPOINTER ストレージオブジェクトに指定したポインターが無効でした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、コピーまたは移動は完了しませんでした。

解説(Remarks)

IStorage::MoveElementTo メソッドは、通常、指定した要素に対して IStorage::CopyTo メソッドを呼び出してから、コピー元の要素を削除するのと同じです。この場合、 MoveElementTo メソッドは、移動を実行するためにコピー先のストレージオブジェクトの公開されている関数のみを使用します。

コピー元とコピー先のストレージオブジェクトが互いの実装について特別な知識を持っている場合(たとえば、同じ実装の異なるインスタンスである場合など)、このメソッドをより効率的に実装できます。

このメソッドを呼び出す前に、移動する要素を閉じ、コピー先のストレージを開いておく必要があります。また、コピー先のオブジェクトおよび要素を、移動元と同じストレージオブジェクト/要素名にすることはできません。つまり、要素を自分自身に移動することはできません。

vtbl 9 HRESULT Commit(DWORD grfCommitFlags)

Commit メソッドは、トランザクションモードで開いているストレージオブジェクトに対して行われた変更が、親ストレージに反映されるようにします。

grfCommitFlagsDWORDin変更をストレージオブジェクトにコミットする方法を制御します。これらの値の定義については、 STGC 列挙型を参照してください。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK ストレージオブジェクトへの変更が親レベルに正常にコミットされました。STGC_CONSOLIDATE が指定されていた場合、ストレージは正常に統合(consolidate)されたか、またはストレージが既に十分にコンパクトでこれ以上統合できませんでした。
STG_S_MULTIPLEOPENS コミット操作は成功しましたが、ストレージが STGM_NOSNAPSHOT フラグを使用して複数回開かれていたため、統合できませんでした。
STG_S_CANNOTCONSOLIDATE コミット操作は成功しましたが、ストレージモードが正しくないため、ストレージを統合できませんでした。複合ファイルの場合、ストレージが STGM_NOSCRATCH フラグを使用して開かれていたか、またはストレージが最も外側のトランザクションレベルではない可能性があります。
STG_S_CONSOLIDATIONFAILED コミット操作は成功しましたが、内部エラー(たとえばメモリ割り当ての失敗など)により、ストレージを統合できませんでした。
E_PENDING 非同期ストレージのみ: コミットするデータの一部またはすべてが現在利用できません。
STG_E_INVALIDFLAG grfCommitFlags パラメーターの値が無効です。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_NOTCURRENT ストレージオブジェクトの別の開いているインスタンスが変更をコミットしました。そのため、現在のコミット操作は以前の変更を上書きする可能性があります。
STG_E_MEDIUMFULL コミットするためのデバイスの空き領域がありません。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、コミット操作を完了できませんでした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。

解説(Remarks)

IStorage::Commit は、トランザクションモードのストレージオブジェクトに対して変更を永続化します。トランザクションモードでは、変更はバッファーに蓄積され、このメソッドが呼び出されるまでストレージオブジェクトには反映されません。もう一方の方法は、オブジェクトをダイレクトモードで開くことで、この場合は変更がただちにストレージオブジェクトに反映されます。ダイレクトモードで開いたオブジェクトでは、ストレージオブジェクトへの変更を永続化するために IStorage::Commit を呼び出す必要はありません。ダイレクトモードで開いた非ルートストレージに対して IStorage::Commit メソッドを呼び出しても効果はありません。ルートストレージオブジェクトをダイレクトモードで開くと、メモリバッファー内の変更が基になるストレージデバイスに書き込まれることが保証されます。

コミット操作は、このストレージオブジェクトとその子における現在の変更を、ストレージ階層の 1 つ上のレベルに公開します。コミットする前に現在の変更を取り消すには、IStorage::Revert を呼び出して、最後にコミットされたバージョンにロールバックします。

IStorage::Commit を呼び出しても、このストレージオブジェクトの現在開いているネストされた要素には影響しません。それらは有効なまま使用できます。ただし、IStorage::Commit メソッドは、これらのネストされた要素への変更を自動的にはコミットしません。コミット操作は、既知の変更のみをストレージ階層の 1 つ上のレベルに公開します。したがって、ネストされたレベルへのトランザクションは、より上位のレベルにコミットする前に、このストレージオブジェクトにコミットする必要があります。

コミット操作では、コミット処理中にデータが保護されるように対策を講じる必要があります。

ストレージ実装が STGC_CONSOLIDATE フラグをサポートしていない場合、grfCommitFlags パラメーターに STGC_CONSOLIDATE を指定して IStorage::Commit を呼び出すと、値 STG_E_INVALIDFLAG が返されます。
vtbl 10 HRESULT Revert()

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

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK 復帰(revert)操作が成功しました。
E_PENDING 非同期ストレージのみ: ストレージのデータの一部またはすべてが現在利用できません。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、復帰(revert)操作を完了できませんでした。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、復帰(revert)操作を完了できませんでした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。

解説(Remarks)

トランザクションモードで開かれたストレージオブジェクトに対して、IStorage::Revert メソッドは、このストレージオブジェクトへの未コミットの変更、またはネストされた要素からこのストレージオブジェクトにコミットされた変更を破棄します。

このメソッドが戻った後、復帰(revert)されたストレージオブジェクトから開かれていた既存の要素(サブストレージまたはストリーム)は無効になり、それ以降使用できなくなります。これらの復帰された要素を IUnknown::Release 以外の呼び出しで指定すると、エラー STG_E_REVERTED が返されます。

このメソッドは、ダイレクトモードで開かれたストレージオブジェクトには影響しません。

vtbl 11 HRESULT EnumElements(DWORD reserved1, void* reserved2, DWORD reserved3, IEnumSTATSTG** ppenum)

EnumElements メソッドは、このストレージオブジェクト内に含まれるストレージオブジェクトおよびストリームオブジェクトを列挙するために使用できる列挙子オブジェクトへのポインターを取得します。

reserved1DWORDoptional将来の使用のために予約されています。ゼロを指定する必要があります。
reserved2void*optional将来の使用のために予約されています。NULL を指定する必要があります。
reserved3DWORDoptional将来の使用のために予約されています。ゼロを指定する必要があります。
ppenumIEnumSTATSTG**out新しい列挙子オブジェクトへのインターフェースポインターを受け取る、 IEnumSTATSTG* ポインター変数へのポインター。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK 列挙子オブジェクトが正常に返されました。
E_PENDING 非同期ストレージのみ: 要素のデータの一部またはすべてが現在利用できません。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、列挙子オブジェクトを作成できませんでした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。

解説(Remarks)

このメソッドが返す列挙子オブジェクトは、 IEnumSTATSTG インターフェースを実装します。これは、NextResetCloneSkip の各メソッドを含む標準の列挙子インターフェースの 1 つです。 IEnumSTATSTG は、 STATSTG 構造体の配列に格納されたデータを列挙します。

要素の列挙を可能にするには、ストレージオブジェクトを読み取りモードで開いておく必要があります。

列挙子オブジェクトは、要素を任意の順序で列挙してかまいません。 また、列挙子オブジェクトは、列挙をスナップショットとして扱うことも、 ストレージオブジェクトの現在の状態を列挙に反映させることもできます。

vtbl 12 HRESULT DestroyElement(LPWSTR pwcsName)

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

pwcsNameLPWSTRin削除するストレージまたはストリームの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK 要素が正常に削除されました。
E_PENDING 非同期ストレージのみ: 要素のデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED 呼び出し元に要素を削除する権限がありません。
STG_E_FILENOTFOUND 指定した名前の要素が存在しません。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、要素は削除されませんでした。
STG_E_INVALIDNAME pwcsName の値が無効です。
STG_E_INVALIDPOINTER 要素に指定したポインターが無効でした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、要素は削除されませんでした。

解説(Remarks)

DestroyElement メソッドは、現在のストレージオブジェクトからサブストレージまたはストリームを削除します。 DestroyElement の呼び出しが成功すると、親ストレージから開かれていた、削除された要素のすべてのインスタンスが無効になります。

ストレージオブジェクトがトランザクションモードで開かれている場合、要素の破棄には、 DestroyElement の呼び出しに続いて IStorage::Commit を呼び出す必要があります。

Note DestroyElement メソッドはディレクトリストリームを縮小しません。削除されたディレクトリエントリを無効としてマークするだけです。無効なエントリは、新しいストレージまたはストリームを作成するときに再利用されます。

コンテンツストリームの場合、削除されたストリームのセクターは空きとしてマークされます。空きセクターがファイルの末尾にある場合、ドキュメントファイルは縮小されます。ドキュメントファイルを圧縮(コンパクト化)するには、ルートストレージオブジェクトに対して IStorage::CopyTo を呼び出し、新しいストレージオブジェクトにコピーします。

vtbl 13 HRESULT RenameElement(LPWSTR pwcsOldName, LPWSTR pwcsNewName)

RenameElement メソッドは、このストレージオブジェクト内の指定したサブストレージまたはストリームの名前を変更します。

pwcsOldNameLPWSTRin

名前を変更するサブストレージまたはストリームの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。

Note CreateStorage または CreateStream で作成される pwcsName の長さは、文字列終端文字を含めずに 31 文字を超えてはなりません。
pwcsNewNameLPWSTRin

指定したサブストレージまたはストリームの新しい名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。

Note CreateStorage または CreateStream で作成される pwcsName の長さは、文字列終端文字を含めずに 31 文字を超えてはなりません。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK 要素の名前が正常に変更されました。
E_PENDING 非同期ストレージのみ: 要素のデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED 呼び出し元に要素の名前を変更するための十分な権限がありません。
STG_E_FILENOTFOUND 指定した古い名前の要素が存在しません。
STG_E_FILEALREADYEXISTS 新しい名前で指定された要素は既に存在します。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、要素の名前は変更されませんでした。
STG_E_INVALIDNAME いずれかの名前の値が無効です。
STG_E_INVALIDPOINTER 要素に指定したポインターが無効でした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、要素の名前は変更されませんでした。

解説(Remarks)

IStorage::RenameElement は、このストレージオブジェクト内の指定したサブストレージまたはストリームの名前を変更します。ストレージオブジェクト内の要素は、開いている間は名前を変更できません。ストレージがトランザクションモードで開かれている場合、名前の変更操作は変更のコミットの対象となります。

IStorage::RenameElement メソッドは、トランザクションモードで開かれたストレージオブジェクトを使用する場合、メモリが少ない状況で動作する保証はありません。ダイレクトモードでは動作する場合があります。

vtbl 14 HRESULT SetElementTimes(LPWSTR pwcsName, FILETIME* pctime, FILETIME* patime, FILETIME* pmtime)

SetElementTimes メソッドは、基になるファイルシステムがこのメソッドをサポートしている場合、指定したストレージ要素の更新時刻、アクセス時刻、作成時刻を設定します。

pwcsNameLPWSTRin時刻を変更するストレージオブジェクト要素の名前。NULL の場合、時刻はその要素ではなくルートストレージに設定されます。
pctimeFILETIME*in要素の新しい作成時刻、または作成時刻を変更しない場合は NULL
patimeFILETIME*in要素の新しいアクセス時刻、またはアクセス時刻を変更しない場合は NULL
pmtimeFILETIME*in要素の新しい更新時刻、または更新時刻を変更しない場合は NULL

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK 時刻の値が正常に設定されました。
E_PENDING 非同期ストレージのみ: 要素のデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED 呼び出し元に要素を変更するための十分な権限がありません。
STG_E_FILENOTFOUND 指定した名前の要素が存在しません。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、要素は変更されませんでした。
STG_E_INVALIDNAME 要素名の値が無効です。
STG_E_INVALIDPOINTER 要素に指定したポインターが無効でした。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。
STG_E_TOOMANYOPENFILES 開いているファイルが多すぎるため、要素は変更されませんでした。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。

解説(Remarks)

SetElementTimes は、このストレージオブジェクト内の指定したストレージ要素の時刻に関する統計情報を設定します。

すべてのファイルシステムがすべての時刻値をサポートしているわけではありません。このメソッドは、サポートされている時刻を設定し、それ以外は無視します。各時刻値パラメーターは NULL にすることができ、その場合は変更を行わないことを示します。

これらの時刻値を取得するには、 IStorage::Stat メソッドを呼び出します。

vtbl 15 HRESULT SetClass(GUID* clsid)

SetClass メソッドは、指定したクラス識別子(CLSID)をこのストレージオブジェクトに割り当てます。

clsidGUID*inストレージオブジェクトに関連付ける CLSID。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK CLSID が正常に割り当てられました。
E_PENDING 非同期ストレージのみ: ストレージのデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED 呼び出し元にストレージオブジェクトへ CLSID を割り当てるための十分な権限がありません。
STG_E_MEDIUMFULL 操作を完了するためのデバイスの空き領域が不足していました。
STG_E_REVERTED トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。

解説(Remarks)

ストレージオブジェクトは、最初に作成されたとき、関連付けられた CLSID として CLSID_NULL を持ちます。ストレージオブジェクトに CLSID を割り当てるには、SetClass を呼び出します。

ストレージオブジェクトの現在の CLSID を取得するには、 IStorage::Stat メソッドを呼び出します。

vtbl 16 HRESULT SetStateBits(DWORD grfStateBits, DWORD grfMask)

SetStateBits メソッドは、最大 32 ビットの状態情報をこのストレージオブジェクトに格納します。

grfStateBitsDWORDin設定するビットの新しい値を指定します。これらのビットに有効な値は定義されておらず、すべて将来の使用のために予約されているため、アプリケーションで使用してはなりません。
grfMaskDWORDinこの呼び出しで grfStateBits のどのビットが有効であるかを示すバイナリマスク。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK 状態情報が正常に設定されました。
E_PENDING 非同期ストレージのみ: ストレージのデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED 呼び出し元にこのストレージオブジェクトを変更するための十分な権限がありません。
STG_E_INVALIDFLAG grfStateBits または grfMask パラメーターの値が無効です。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。

解説(Remarks)

状態ビットの値は現在定義されていません。

vtbl 17 HRESULT Stat(STATSTG* pstatstg, DWORD grfStatFlag)

Stat メソッドは、この開いているストレージオブジェクトの STATSTG 構造体を取得します。

pstatstgSTATSTG*out戻り値として、このメソッドが開いているストレージオブジェクトに関する情報を格納する STATSTG 構造体へのポインター。エラーが発生した場合、このパラメーターは NULL になります。
grfStatFlagDWORDinSTATSTG 構造体の一部のメンバーを返さないように指定し、これによりメモリ割り当て操作を省きます。値は STATFLAG 列挙型から取得します。

戻り値

このメソッドは、次の値のいずれかを返すことがあります。

リターンコード 説明
S_OK STATSTG 構造体が指定した場所に正常に返されました。
E_PENDING 非同期ストレージのみ: ストレージのデータの一部またはすべてが現在利用できません。
STG_E_ACCESSDENIED 呼び出し元にこのストレージオブジェクトの統計情報にアクセスするための十分な権限がありません。
STG_E_INSUFFICIENTMEMORY メモリ不足のため、STATSTG 構造体は返されませんでした。
STG_E_INVALIDFLAG grfStateFlag パラメーターの値が無効です。
STG_E_INVALIDPARAMETER いずれかのパラメーターが無効でした。

解説(Remarks)

IStorage::Stat は、現在のストレージオブジェクトの STATSTG 構造体を取得します。 STATSTG 構造体には、ストレージオブジェクトに関する統計情報が含まれます。IStorage::EnumElements は、列挙子オブジェクトへのポインターを返します。このメソッドが返す列挙子オブジェクトは IEnumSTATSTG インターフェースを実装しており、これを通じて STATSTG 構造体の配列に格納されたデータが列挙されます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IStorage "{0000000B-0000-0000-C000-000000000046}"
#usecom global IStorage IID_IStorage "{}"
#comfunc global IStorage_CreateStream     3 wstr,int,int,int,sptr
#comfunc global IStorage_OpenStream       4 wstr,sptr,int,int,sptr
#comfunc global IStorage_CreateStorage    5 wstr,int,int,int,sptr
#comfunc global IStorage_OpenStorage      6 wstr,sptr,int,var,int,sptr
#comfunc global IStorage_CopyTo           7 int,var,var,sptr
#comfunc global IStorage_MoveElementTo    8 wstr,sptr,wstr,int
#comfunc global IStorage_Commit           9 int
#comfunc global IStorage_Revert           10
#comfunc global IStorage_EnumElements     11 int,sptr,int,sptr
#comfunc global IStorage_DestroyElement   12 wstr
#comfunc global IStorage_RenameElement    13 wstr,wstr
#comfunc global IStorage_SetElementTimes  14 wstr,var,var,var
#comfunc global IStorage_SetClass         15 var
#comfunc global IStorage_SetStateBits     16 int,int
#comfunc global IStorage_Stat             17 var,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。