IStorage::Commit メソッド (objidl.h)
Commit メソッドを使用すると、トランザクション モードで開いているストレージ オブジェクトに加えられた変更が親ストレージに反映されます。 ダイレクト モードの非ルート ストレージ オブジェクトの場合、このメソッドは無効です。 ルート ストレージの場合は、実際のデバイスの変更が反映されます。たとえば、ディスク上のファイルなどです。 直接モードで開かれたルート ストレージ オブジェクトの場合は、常に Release の前に IStorage::Commit メソッドを呼び出します。 IStorage::Commit は 、ダイレクト モードでルート ストレージのすべてのメモリ バッファーをディスクにフラッシュし、エラー時にエラー コードを返します。 Release ではメモリ バッファーもディスクにフラッシュされますが、障害発生時にエラー コードを返す容量はありません。 したがって、最初に Commit を呼び出さずに Release を呼び出すと、不確定な結果が発生します。
構文
HRESULT Commit(
[in] DWORD grfCommitFlags
);
パラメーター
[in] grfCommitFlags
変更をストレージ オブジェクトにコミットする方法を制御します。 これらの値の定義については、 STGC 列挙を参照してください。
戻り値
このメソッドは、これらの値のいずれかを返すことができます。
リターン コード | 説明 |
---|---|
S_OK | ストレージ オブジェクトへの変更は、親レベルに正常にコミットされました。 STGC_CONSOLIDATE指定した場合、ストレージは正常に統合されたか、ストレージが既にコンパクトすぎてさらに統合されませんでした。 |
STG_S_MULTIPLEOPENS | コミット操作は成功しましたが、STGM_NOSNAPSHOT フラグを使用して複数回開かれたため、ストレージを統合できませんでした。 |
STG_S_CANNOTCONSOLIDATE | コミット操作は成功しましたが、ストレージ モードが正しくないため、ストレージを統合できませんでした。 複合ファイルの場合、ストレージが STGM_NOSCRATCH フラグを使用して開かれているか、ストレージが最も外側のトランザクション レベルではない可能性があります。 |
STG_S_CONSOLIDATIONFAILED | コミット操作は成功しましたが、内部エラー (メモリ割り当てエラーなど) が原因でストレージを統合できませんでした。 |
E_PENDING | 非同期ストレージのみ: コミットするデータの一部または全部が現在使用できません。 |
STG_E_INVALIDFLAG | grfCommitFlags パラメーターの値が無効です。 |
STG_E_INVALIDPARAMETER | パラメーターの 1 つが無効でした。 |
STG_E_NOTCURRENT | ストレージ オブジェクトの別のオープン インスタンスが変更をコミットしました。 その結果、現在のコミット操作によって以前の変更が上書きされる可能性があります。 |
STG_E_MEDIUMFULL | コミットする領域がデバイスに残っていない。 |
STG_E_TOOMANYOPENFILES | 開いているファイルが多すぎるため、コミット操作を完了できませんでした。 |
STG_E_REVERTED | ストレージ オブジェクトは、トランザクション ツリーの上の元に戻す操作によって無効になっています。 |
注釈
IStorage::Commit は、トランザクション モードのストレージ オブジェクトに永続的な変更を加えます。この変更はバッファーに蓄積され、このメソッドの呼び出しが行われるまでストレージ オブジェクトには反映されません。 代わりに、直接モードでオブジェクトを開き、変更がすぐにストレージ オブジェクトに反映されるようにすることもできます。 ダイレクト モードで開かれたオブジェクトは、ストレージ オブジェクトに永続的な変更を加えるために IStorage::Commit を呼び出す必要はありません。 ダイレクト モードで開かれた非ルート ストレージで IStorage::Commit メソッドを呼び出しても、効果はありません。 ルート ストレージ オブジェクトをダイレクト モードで開くと、メモリ バッファーの変更が基になるストレージ デバイスに確実に書き込まれます。
コミット操作は、このストレージ オブジェクトとその子の現在の変更をストレージ階層の次のレベルに発行します。 現在の変更をコミットする前に元に戻すには、 IStorage::Revert を呼び出して、最後にコミットされたバージョンにロールバックします。
IStorage::Commit を呼び出しても、このストレージ オブジェクトの現在開いている入れ子になった要素には影響しません。 これらは有効なままであり、使用できます。 ただし、 IStorage::Commit メソッドは、これらの入れ子になった要素に対する変更を自動的にコミットしません。 コミット操作では、既知の変更のみがストレージ階層の次の上位レベルに発行されます。 したがって、入れ子になったレベルへのトランザクションは、上位のレベルにコミットする前に、このストレージ オブジェクトにコミットする必要があります。
コミット操作では、コミット プロセス中にデータが確実に保護されるようにする手順を実行する必要があります。
- ルート ストレージ オブジェクトに変更をコミットする場合、呼び出し元は戻り値をチェックして、操作が正常に完了したかどうかを判断する必要があります。完了していない場合は、IStorage の古いコミットされた内容がまだそのままであり、復元できることを確認する必要があります。
- このストレージ オブジェクトが一部の項目を除外して開かれた場合、呼び出し元はコミットを呼び出す前に書き直す必要があります。 コミットを成功させるためには、ストレージを開くときに書き込みモードが必要です。
- 同じストレージ オブジェクトで複数の同時ライターを禁止しない限り、このメソッドを呼び出すアプリケーションでは、 grfCommitFlags パラメーターに少なくともSTGC_ONLYIFCURRENTを指定して、あるライターによって加えられた変更が別のライターによって誤って上書きされないようにする必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | objidl.h |
Library | Uuid.lib |
[DLL] | Ole32.dll |