IDirectWriterLock - 複合ファイルの実装
IDirectWriterLock の複合ファイル実装では、1 つのライターと複数のリーダーを使用して複合ファイルを直接モードで開く方法が提供されます。
複合ファイルは、STGM_DIRECT フラグを使用して直接モードで開くことができます。 IDirectWriterLock インターフェイスは、STGM_READWRITEを設定します。スナップショット コピーのオーバーヘッドを必要とせずに、ダイレクト モードで有効なフラグをSTGM_SHARE_DENY_WRITEします。
STGM_TRANSACTED フラグを使用して複合ファイルをトランザクション モードで開くと、STGM_READWRITE を使用して複数のリーダーと 1 つのライターを作成することもできます。STGM_SHARE_DENY_WRITE フラグ。 ただし、この場合は、リーダー用にファイルのスナップショットコピーが作成されます。 多くの場合、スクラッチ コピーのオーバーヘッドがあります。
使用するタイミング
ダイレクト モード (STGM_DIRECT) でストレージを開くときに 、IDirectWriterLock のシステム提供の実装を使用STGM_READWRITE|STGM_SHARE_DENY_WRITEフラグ。
IDirectWriterLock へのポインターを取得するには、IStorage の QueryInterface を呼び出して、複合ファイルのルート ストレージ オブジェクトを取得します。
複合ファイルへの排他的な書き込みアクセスを取得するには、 IDirectWriterLock::WaitForWriteAccess を呼び出します。 IDirectWriterLock::ReleaseWriteAccess を呼び出して、排他的書き込みアクセスを解放します。
IDirectWriterLock::HaveWriteAccess は、ファイルが現在ロックされているかどうかを示します。
解説
シングル ライターのマルチリーダー機能の複合ファイル実装は、範囲ロックに基づいています。 ライターは、現在のすべてのリーダーがストレージを閉じた後に書き込むストレージへの排他的アクセスを取得します。 ライターがアクティブな間は、後続のリーダーはストレージを開くことができません。 ライターは IDirectWriterLock::WaitForWriteAccess を呼び出して、排他的書き込みアクセスを取得します。 その後、ライターは IDirectWriterLock::ReleaseWriteAccess を呼び出してストレージを解放する必要があります。
このシングルリーダーのマルチライター モードで書き込む前に、 IDirectWriterLock::WaitForWriteAccess の呼び出しが必要です。 IDirectWriterLock::WaitForWriteAccess を呼び出さずにファイルに書き込もうとすると、最初に STG_E_ACCESSDENIED。 このエラーは、ライターが最初にファイルを開き、現在ファイルを開いているリーダーがいない場合でも返されます。
マーシャリングに関する考慮事項
カスタム マーシャリングは、通常、複合ファイルが同じコンピューター上の別のプロセスにマーシャリングされるときに使用されます。 ストレージをマーシャリングする場合、アクセス権は考慮されず、元のマーシャリング プロセスと同じアクセス モードと権限を持つ新しいプロセスに IStorage ポインターが渡されます。 アクセス モードの詳細については、「 STGM 定数」を参照してください。 マーシャリング中は、排他的な書き込みアクセスを確保するためにロックは行われず、検証もされません。 この場合、シングル ライターマルチリーダー モードで開かれた複合ファイルに対して、シングル ライター ポリシーは適用されません。 代わりに、強制は複合ファイルの実装によって内部的に処理されます。
IStorage ポインターはマーシャリング中に別のプロセスに渡されるため、2 つのプロセスが同じ複合ファイルに同時にアクセスできます。 呼び出し元が IDirectWriterLock::WaitForWriteAccess を呼び出すことによってストレージへの排他的書き込みアクセス権を取得した場合でも、マーシャリングされたバージョンは同時にアクセスすることもできます。 マーシャリングされたバージョンは、単一のライターがファイルにアクセスしている間は強制的に閉じません。 この場合、複合ファイルの実装は内部的に書き込みを同期します。
1 つのライターが IDirectWriterLock::WaitForWriteAccess を呼び出して排他アクセスを取得した場合、マーシャリングされたストレージも書き込みアクセス権を持ち、 IDirectWriterLock::WaitForWriteAccess を呼び出す必要はありません。 どちらのプロセスにも書き込みアクセス権があり、同期は内部複合ファイルの実装によって制御されます。
関連トピック