Structured StorageFundamentalsStructured Storage Access Modes

構造化ストレージアクセスモード

マルチプロセスや複数のユーザによる、単一のオブジェクトに対しての同時アクセスを制御する機構は重要です。 COM は、このような機構を、ストレージオブジェクトとストリームオブジェクト双方に対して、アクセスモードの定義によって提供します。 親ストレージオブジェクトで定義されたアクセスモードは、子オブジェクトにも継承されますが、それらの子ストレージやストリームに対して追加の制限を定める事もできます。 入れ子になったストレージやストリームオブジェクトは、親オブジェクトと同じモードもしくは、より制限されたモードで開く事ができますが、親オブジェクトより制限が少ないモードで開く事はできません。

STGM 列挙体として一覧化された値を使用することによってアクセスモードについて説明します。 これらの値は、IStorage インタフェースメソッドの引数のフラグとして渡され、API 関数に関連付けされます。 一般的にこのフラグは、grfMode パラメータの組み合わせで表現され、OR 論理操作を使用します。

このフラグは、以下の 6グループに分類されます。 同じグループからは、同時に 1つのフラグのみ使用可能となります。

トランザクションフラグ

オブジェクトは、ダイレクトモードもしくはトランザクションモードのどちらかで開く事ができます。 ダイレクトモードで開かれた場合、変更事項は即座かつ恒久的に適用されます。 トランザクションモードで開かれた場合、変更はバッファされ、明示的にコミットされるか復帰される事で編集が完了します。 コミットされた変更はオブジェクトに保存されますが、復帰された場合は変更が破棄されます。 ダイレクトモードが標準のアクセスモードとなります。

トランザクションモードは、入れ子になった要素を使用する時に、その親ストレージオブジェクトには要求されません。 しかし、入れ子になった要素のトランザクションは、その親ストレージオブジェクトのトランザクションに内包されます。 そのため、 子オブジェクトへの変更は、親オブジェクトがコミットされるまで確定されず、また(トップレベルとなる)ルートストレージオブジェクトがディスクに実際に書き込まれるまで、コミットされていない状態となります。 言い換えると、この変更は外側へ伝播し、内側のオブジェクトは、その直接のコンテナに対するトランザクションに変更を通知します。

ストレージ生成フラグ

ストレージ生成フラグは、既存のストレージ、ストリームやロックバイトオブジェクトと、新しく生成しようとしたそれらが同じ名前である場合の COM の動作を指定します。 標準ではエラーメッセージを返し、新規オブジェクトは生成しません。 生成呼び出し時に、このフラグのうち 1つだけを使用できます。

一時ファイル生成フラグ

一時ファイル生成フラグは、ルートストレージオブジェクトが解放される時に、根拠となるファイルが自動的に破棄される事を示します。 この性能は、テンポラリファイルを生成するのに非常に便利です。

優先フラグ

優先フラグは、ストレージオブジェクトを優先モードで開きます。 オブジェクトを開く時、他のアプリケーションが同時にそのオブジェクトを使用しているかも知れないため、アプリケーションは通常、スナップショットのコピーで作業します。 しかし、ストレージオブジェクトを優先モードで開くと、 アプリケーションは排他的にオブジェクトの変更をコミットできます。

優先モードは、システムにスナップショットコピーの作成を要求するモードでオブジェクトを開く前に、アプリケーションがストレージから複数のストリームを読めるようにします。 アプリケーションが排他アクセスを持つと、オブジェクトのスナップショットコピーを作る必要がありません。 その後にアプリケーションがスナップショットコピーを必要とするモードでオブジェクトを開いた場合、アプリケーションはスナップショットから既に読み込まれたストリームを除外でき、その結果、オブジェクトを開くためのオーバーヘッドを縮小することができます。

オブジェクトが優先モードで開かれている間、他のアプリケーションはそれに対する変更をコミットできないため、アプリケーションがこのモードでオブジェクトを占有するのは可能な限り短くすべきです。

アクセス許可フラグ

アクセス許可フラグは、クライアントアプリケーションがオブジェクトを開く時の、読み込み、書き込み、読み書きといったアクセス方法を表します。 読み取り許可は、アプリケーションがストリームの内容を読み取ることができるようにしますが、そのストリームに対する変更を書き込む事はできません。 書き込み許可は、アプリケーションに変更をオブジェクトのストレージへ確定する関数を呼せるようにしますが、そのストリームの内容を読み取る事はできません。 読み書き許可は、アプリケーションにオブジェクトのストリームを読み取り、またオブジェクトのストレージに書き込めるようにします。

共有アクセスフラグ

共有アクセスフラグは、アプリケーションが開いているオブジェクトに他のアプリケーションがどの程度アクセスできるかを表します。 読み取り、書き込み、または全てのアクセスを拒否する事ができます。 また、どのアクセスタイプについても拒否しないと明示する事もできます。