IStorage
COM公式ドキュメント
IStorage インターフェースは、構造化ストレージオブジェクトの作成と管理をサポートします。
メソッド 15
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
このストレージオブジェクトに含まれる、指定した名前のストリームオブジェクトを作成して開きます。
| pwcsName | LPWSTR | in | 新しく作成するストリームの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。この名前は、後でストリームを開いたり再度開いたりするために使用できます。名前の長さは、文字列終端文字を含めずに 31 文字を超えてはなりません。ストリーム/ストレージ名の先頭文字となる 000 から 01f までの文字は、OLE による使用のために予約されています。これは複合ファイルの制限であり、構造化ストレージの制限ではありません。 |
| grfMode | STGM | in | 新しく作成したストリームを開くときに使用するアクセスモードを指定します。詳細と指定可能な値の説明については、STGM Constants を参照してください。 |
| reserved1 | DWORD | in | 将来の使用のために予約されています。ゼロを指定する必要があります。 |
| reserved2 | DWORD | in | 将来の使用のために予約されています。ゼロを指定する必要があります。 |
| ppstm | IStream** | 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 メソッドは、次の動作をサポートしていません。
- STGM_DELETEONRELEASE フラグはサポートされていません。
- ストリームオブジェクトではトランザクションモード(STGM_TRANSACTED)はサポートされていません。
- 同じストレージから同じストリームを複数回開くことはサポートされていません。grfMode パラメーターには共有モードフラグ STGM_SHARE_EXCLUSIVE を指定する必要があります。
このストレージオブジェクト内の既存のストリームオブジェクトを、指定したアクセスモードで開きます。
| pwcsName | LPWSTR | in | 開くストリームの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。ストリーム/ストレージ名の先頭文字となる 000 から 01f までの文字は、OLE による使用のために予約されています。これは複合ファイルの制限であり、構造化ストレージの制限ではありません。 |
| reserved1 | void* | optional | 将来の使用のために予約されています。NULL を指定する必要があります。 |
| grfMode | STGM | in | 開いたストリームに割り当てるアクセスモードを指定します。詳細と指定可能な値の説明については、STGM Constants を参照してください。複合ファイル実装でこのメソッドを呼び出す場合、選択するその他のモードは、少なくとも STGM_SHARE_EXCLUSIVE を指定する必要があります。 |
| reserved2 | DWORD | in | 将来の使用のために予約されています。ゼロを指定する必要があります。 |
| ppstm | IStream** | 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 を指定して開く必要があります。
指定した名前で、指定したアクセスモードにより、このストレージオブジェクト内にネストされる新しいストレージオブジェクトを作成して開きます。
| pwcsName | LPWSTR | in | 新しく作成するストレージオブジェクトの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。この名前は、後でストレージオブジェクトを再度開くために使用できます。名前の長さは、文字列終端文字を含めずに 31 文字を超えてはなりません。ストリーム/ストレージ名の先頭文字となる 000 から 01f までの文字は、OLE による使用のために予約されています。これは複合ファイルの制限であり、構造化ストレージの制限ではありません。 |
| grfMode | STGM | in | 新しく作成したストレージオブジェクトを開くときに使用するアクセスモードを指定する値。詳細と指定可能な値の説明については、STGM Constants を参照してください。 |
| reserved1 | DWORD | in | 将来の使用のために予約されています。ゼロを指定する必要があります。 |
| reserved2 | DWORD | in | 将来の使用のために予約されています。ゼロを指定する必要があります。 |
| ppstg | IStorage** | 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 メソッドは、次の動作をサポートしていません。
- 非ルートストレージに対する STGM_PRIORITY フラグ。
- 同じ親ストレージから同じストレージオブジェクトを複数回開くこと。STGM_SHARE_EXCLUSIVE フラグを指定する必要があります。
- STGM_DELETEONRELEASE フラグ。このフラグを指定すると、関数は STG_E_INVALIDFLAG を返します。
指定した名前の既存のストレージオブジェクトを、指定したアクセスモードで開きます。
| pwcsName | LPWSTR | in | 開くストレージオブジェクトの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。ストリーム/ストレージ名の先頭文字となる 000 から 01f までの文字は、OLE による使用のために予約されています。これは複合ファイルの制限であり、構造化ストレージの制限ではありません。pstgPriority が非 NULL の場合、これは無視されます。 |
| pstgPriority | IStorage* | in | NULL を指定する必要があります。非 NULL の値を指定すると STG_E_INVALIDPARAMETER が返されます。 |
| grfMode | STGM | in | ストレージオブジェクトを開くときに使用するアクセスモードを指定します。指定可能な値の説明については、STGM Constants を参照してください。このメソッドを呼び出す際、選択するその他のモードは、少なくとも STGM_SHARE_EXCLUSIVE を指定する必要があります。 |
| snbExclude | WORD** | in | NULL を指定する必要があります。非 NULL の値を指定すると STG_E_INVALIDPARAMETER が返されます。 |
| reserved | DWORD | in | 将来の使用のために予約されています。ゼロを指定する必要があります。 |
| ppstg | IStorage** | 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)を受け取ったときに破棄されます。これは一時的なストレージオブジェクトの作成に役立ちます。
開いているストレージオブジェクトの内容全体を、別のストレージオブジェクトにコピーします。
| ciidExclude | DWORD | in | rgiidExclude が指す配列内の要素数。rgiidExclude が NULL の場合、ciidExclude は無視されます。 |
| rgiidExclude | GUID* | inoptional | インターフェース識別子(IID)の配列。呼び出し元が把握していてコピーしたくないインターフェース、またはストレージオブジェクトがサポートしていないが呼び出し元が後で明示的にその状態をコピーするインターフェースを指定します。この配列には IStorage(ストリームオブジェクトのみをコピーすることを示す)や IStream(ストレージオブジェクトのみをコピーすることを示す)を含めることができます。配列の長さがゼロの場合、 IStorage オブジェクトが公開する状態のみがコピーされ、オブジェクト上のその他のすべてのインターフェースは無視されます。NULL を渡した場合、オブジェクト上のすべてのインターフェースがコピーされます。 |
| snbExclude | WORD** | inoptional | コピー先にコピーしないストレージオブジェクトまたはストリームオブジェクトのブロックを指定する文字列名ブロック( SNB を参照)。これらの要素はコピー先には作成されません。rgiidExclude 配列に IID_IStorage が含まれている場合、このパラメーターは無視されます。このパラメーターは NULL でもかまいません。 |
| pstgDest | IStorage* | 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::CopyTo と IStream::CopyTo を呼び出します。
同じ名前の既存のストリームに上書きする形でストリームをコピーする場合、既存のストリームはまず削除され、その後コピー元のストリームに置き換えられます。同じ名前の既存のストレージに上書きする形でストレージをコピーする場合、既存のストレージは削除されません。そのため、コピー操作の後、コピー先の IStorage には、同じ名前の新しい要素で置き換えられなかった古い要素が残ります。
ストレージオブジェクトは、 IStorage 以外にも、 IRootStorage、 IPropertyStorage、 IPropertySetStorage などのインターフェースを公開する場合があります。rgiidExclude パラメーターを使用すると、これらの追加インターフェースの一部またはすべてをコピー操作から除外できます。
既存のサブストレージまたはストリームオブジェクトのより新しい、あるいはより効率的なコピーを持つ呼び出し元は、これらのオブジェクトの現在のバージョンをコピー操作から除外したい場合があります。snbExclude パラメーターと rgiidExclude パラメーターは、ストレージオブジェクトの既存のストレージまたはストリームを除外する 2 つの方法を提供します。
呼び出し元への注意
IStorage::CopyTo メソッドの最も一般的な使い方は、ほとんどの完全保存(フルセーブ)や名前を付けて保存の操作のように、コピー元からコピー先へすべてをコピーすることです。次のサンプルコードは、コピー元のストレージオブジェクトからコピー先のストレージオブジェクトへすべてをコピーする方法を示しています。
pstg->CopyTo(0, Null, Null, pstgDest)
MoveElementTo メソッドは、サブストレージまたはストリームを、このストレージオブジェクトから別のストレージオブジェクトへコピーまたは移動します。
| pwcsName | LPWSTR | in | このストレージオブジェクト内で移動またはコピーする要素の名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。 |
| pstgDest | IStorage* | in | コピー先のストレージオブジェクトへの IStorage ポインター。 |
| pwcsNewName | LPWSTR | in | 新しいストレージオブジェクト内での要素の新しい名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。 |
| grfFlags | DWORD | in | 操作を移動(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 メソッドは、移動を実行するためにコピー先のストレージオブジェクトの公開されている関数のみを使用します。
コピー元とコピー先のストレージオブジェクトが互いの実装について特別な知識を持っている場合(たとえば、同じ実装の異なるインスタンスである場合など)、このメソッドをより効率的に実装できます。
このメソッドを呼び出す前に、移動する要素を閉じ、コピー先のストレージを開いておく必要があります。また、コピー先のオブジェクトおよび要素を、移動元と同じストレージオブジェクト/要素名にすることはできません。つまり、要素を自分自身に移動することはできません。
Commit メソッドは、トランザクションモードで開いているストレージオブジェクトに対して行われた変更が、親ストレージに反映されるようにします。
| grfCommitFlags | DWORD | in | 変更をストレージオブジェクトにコミットする方法を制御します。これらの値の定義については、 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 つ上のレベルに公開します。したがって、ネストされたレベルへのトランザクションは、より上位のレベルにコミットする前に、このストレージオブジェクトにコミットする必要があります。
コミット操作では、コミット処理中にデータが保護されるように対策を講じる必要があります。
- ルートストレージオブジェクトへの変更をコミットする際、呼び出し元は戻り値を確認して操作が正常に完了したかどうかを判断し、完了していない場合は IStorage の古いコミット済みの内容がまだ無傷で復元可能であることを確認する必要があります。
- このストレージオブジェクトが一部の項目を除外して開かれていた場合、呼び出し元はコミットを呼び出す前にそれらを書き戻す責任があります。コミットを成功させるには、ストレージを開く際に書き込みモードが必要です。
- 同じストレージオブジェクトに対する複数の同時ライターを禁止しない限り、このメソッドを呼び出すアプリケーションは、あるライターが行った変更が別のライターの行った変更を誤って上書きしないように、grfCommitFlags パラメーターに少なくとも STGC_ONLYIFCURRENT を指定する必要があります。
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 が返されます。
このメソッドは、ダイレクトモードで開かれたストレージオブジェクトには影響しません。
EnumElements メソッドは、このストレージオブジェクト内に含まれるストレージオブジェクトおよびストリームオブジェクトを列挙するために使用できる列挙子オブジェクトへのポインターを取得します。
| reserved1 | DWORD | optional | 将来の使用のために予約されています。ゼロを指定する必要があります。 |
| reserved2 | void* | optional | 将来の使用のために予約されています。NULL を指定する必要があります。 |
| reserved3 | DWORD | optional | 将来の使用のために予約されています。ゼロを指定する必要があります。 |
| ppenum | IEnumSTATSTG** | out | 新しい列挙子オブジェクトへのインターフェースポインターを受け取る、 IEnumSTATSTG* ポインター変数へのポインター。 |
戻り値
このメソッドは、次の値のいずれかを返すことがあります。
| リターンコード | 説明 |
|---|---|
| S_OK | 列挙子オブジェクトが正常に返されました。 |
| E_PENDING | 非同期ストレージのみ: 要素のデータの一部またはすべてが現在利用できません。 |
| STG_E_INSUFFICIENTMEMORY | メモリ不足のため、列挙子オブジェクトを作成できませんでした。 |
| STG_E_INVALIDPARAMETER | いずれかのパラメーターが無効でした。 |
| STG_E_REVERTED | トランザクションツリー内の上位で行われた復帰(revert)操作により、ストレージオブジェクトが無効になっています。 |
解説(Remarks)
このメソッドが返す列挙子オブジェクトは、 IEnumSTATSTG インターフェースを実装します。これは、Next、Reset、 Clone、Skip の各メソッドを含む標準の列挙子インターフェースの 1 つです。 IEnumSTATSTG は、 STATSTG 構造体の配列に格納されたデータを列挙します。
要素の列挙を可能にするには、ストレージオブジェクトを読み取りモードで開いておく必要があります。
列挙子オブジェクトは、要素を任意の順序で列挙してかまいません。 また、列挙子オブジェクトは、列挙をスナップショットとして扱うことも、 ストレージオブジェクトの現在の状態を列挙に反映させることもできます。
指定したストレージまたはストリームを、このストレージオブジェクトから削除します。
| pwcsName | LPWSTR | in | 削除するストレージまたはストリームの名前を含む、ワイド文字のヌル終端 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 を呼び出す必要があります。
コンテンツストリームの場合、削除されたストリームのセクターは空きとしてマークされます。空きセクターがファイルの末尾にある場合、ドキュメントファイルは縮小されます。ドキュメントファイルを圧縮(コンパクト化)するには、ルートストレージオブジェクトに対して IStorage::CopyTo を呼び出し、新しいストレージオブジェクトにコピーします。
RenameElement メソッドは、このストレージオブジェクト内の指定したサブストレージまたはストリームの名前を変更します。
| pwcsOldName | LPWSTR | in | 名前を変更するサブストレージまたはストリームの名前を含む、ワイド文字のヌル終端 Unicode 文字列へのポインター。 Note CreateStorage または CreateStream で作成される pwcsName の長さは、文字列終端文字を含めずに 31 文字を超えてはなりません。
|
| pwcsNewName | LPWSTR | in | 指定したサブストレージまたはストリームの新しい名前を含む、ワイド文字のヌル終端 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 メソッドは、トランザクションモードで開かれたストレージオブジェクトを使用する場合、メモリが少ない状況で動作する保証はありません。ダイレクトモードでは動作する場合があります。
SetElementTimes メソッドは、基になるファイルシステムがこのメソッドをサポートしている場合、指定したストレージ要素の更新時刻、アクセス時刻、作成時刻を設定します。
| pwcsName | LPWSTR | in | 時刻を変更するストレージオブジェクト要素の名前。NULL の場合、時刻はその要素ではなくルートストレージに設定されます。 |
| pctime | FILETIME* | in | 要素の新しい作成時刻、または作成時刻を変更しない場合は NULL。 |
| patime | FILETIME* | in | 要素の新しいアクセス時刻、またはアクセス時刻を変更しない場合は NULL。 |
| pmtime | FILETIME* | 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 メソッドを呼び出します。
SetClass メソッドは、指定したクラス識別子(CLSID)をこのストレージオブジェクトに割り当てます。
| clsid | GUID* | 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 メソッドを呼び出します。
SetStateBits メソッドは、最大 32 ビットの状態情報をこのストレージオブジェクトに格納します。
| grfStateBits | DWORD | in | 設定するビットの新しい値を指定します。これらのビットに有効な値は定義されておらず、すべて将来の使用のために予約されているため、アプリケーションで使用してはなりません。 |
| grfMask | DWORD | in | この呼び出しで grfStateBits のどのビットが有効であるかを示すバイナリマスク。 |
戻り値
このメソッドは、次の値のいずれかを返すことがあります。
| リターンコード | 説明 |
|---|---|
| S_OK | 状態情報が正常に設定されました。 |
| E_PENDING | 非同期ストレージのみ: ストレージのデータの一部またはすべてが現在利用できません。 |
| STG_E_ACCESSDENIED | 呼び出し元にこのストレージオブジェクトを変更するための十分な権限がありません。 |
| STG_E_INVALIDFLAG | grfStateBits または grfMask パラメーターの値が無効です。 |
| STG_E_INVALIDPARAMETER | いずれかのパラメーターが無効でした。 |
解説(Remarks)
状態ビットの値は現在定義されていません。
Stat メソッドは、この開いているストレージオブジェクトの STATSTG 構造体を取得します。
| pstatstg | STATSTG* | out | 戻り値として、このメソッドが開いているストレージオブジェクトに関する情報を格納する STATSTG 構造体へのポインター。エラーが発生した場合、このパラメーターは NULL になります。 |
| grfStatFlag | DWORD | in | STATSTG 構造体の一部のメンバーを返さないように指定し、これによりメモリ割り当て操作を省きます。値は 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 公式リファレンス: 英語 (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 指定が可能。#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,sptr,int,sptr #comfunc global IStorage_CopyTo 7 int,sptr,sptr,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,sptr,sptr,sptr #comfunc global IStorage_SetClass 15 sptr #comfunc global IStorage_SetStateBits 16 int,int #comfunc global IStorage_Stat 17 sptr,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。