IDirectWriterLock - Zusammengesetzte Dateiimplementierung

Die zusammengesetzte Dateiimplementierung von IDirectWriterLock bietet eine Möglichkeit, eine zusammengesetzte Datei im direkten Modus mit einem einzelnen Autor und mehreren Lesern zu öffnen.

Zusammengesetzte Dateien können im direkten Modus mit dem STGM_DIRECT-Flag geöffnet werden. Die IDirectWriterLock-Schnittstelle legt die STGM_READWRITE| fest. STGM_SHARE_DENY_WRITE kennzeichen als gültig im direkten Modus, ohne dass der Aufwand einer Momentaufnahmekopie erforderlich ist.

Wenn eine zusammengesetzte Datei im Transaktionsmodus mit dem STGM_TRANSACTED-Flag geöffnet wird, können Sie auch mehrere Leser und einen einzelnen Autor mit dem STGM_READWRITE| STGM_SHARE_DENY_WRITE Flag. In diesem Fall wird jedoch eine Momentaufnahmekopie der Datei für die Leser erstellt. Es gibt häufig einen Aufwand für eine Scratchkopie.

Wann verwendet werden soll

Verwenden Sie die vom System bereitgestellte Implementierung von IDirectWriterLock , wenn Sie einen Speicher im direkten Modus (STGM_DIRECT) mit dem STGM_READWRITE| öffnen STGM_SHARE_DENY_WRITE Flags.

Um einen Zeiger auf IDirectWriterLock abzurufen, rufen Sie QueryInterface auf IStorage auf, um das Stammspeicherobjekt für die zusammengesetzte Datei abzurufen.

Rufen Sie IDirectWriterLock::WaitForWriteAccess auf, um exklusiven Schreibzugriff auf eine zusammengesetzte Datei abzurufen. Rufen Sie IDirectWriterLock::ReleaseWriteAccess auf, um exklusiven Schreibzugriff zu veröffentlichen.

IDirectWriterLock::HaveWriteAccess gibt an, ob die Datei derzeit gesperrt ist.

Bemerkungen

Die Zusammengesetzte Dateiimplementierung des Single-Writer-Features basiert auf der Bereichssperre. Der Autor erhält exklusiven Zugriff auf den Speicher, um zu schreiben, nachdem alle aktuellen Leser den Speicher geschlossen haben. Während der Autor aktiv ist, können nachfolgende Leser den Speicher nicht öffnen. Der Autor ruft IDirectWriterLock::WaitForWriteAccess auf, um exklusiven Schreibzugriff zu erhalten. Der Autor muss dann IDirectWriterLock::ReleaseWriteAccess aufrufen, um den Speicher zu freigeben.

Der Aufruf von IDirectWriterLock::WaitForWriteAccess ist erforderlich, bevor Sie in diesem einzelsprachigen, mehrfach-writer-Modus schreiben. Versucht, in die Datei zu schreiben, ohne IDirectWriterLock::WaitForWriteAccess erste Ergebnisse zu STG_E_ACCESSDENIED. Dieser Fehler wird zurückgegeben, auch wenn der Autor die Datei anfänglich geöffnet hat, und keine Leser haben derzeit die Datei geöffnet.

Überlegungen zum Marshaling

Benutzerdefinierte Marshaling wird in der Regel verwendet, wenn eine zusammengesetzte Datei auf einem anderen Prozess auf demselben Computer gepostet wird. Wenn Speicher gepostet werden, werden Zugriffsrechte nicht berücksichtigt, und der IStorage-Zeiger wird an den neuen Prozess mit den gleichen Zugriffsmodi und -rechten wie dem ursprünglichen Marshaling-Prozess übergeben. Weitere Informationen zu Zugriffsmodi finden Sie unter STGM-Konstanten. Während des Marshalings werden keine Sperren durchgeführt oder überprüft, um den exklusiven Schreibzugriff zu gewährleisten. In diesem Fall gibt es keine Durchsetzung der Single-Writer-Richtlinie für zusammengesetzte Dateien, die im Einzelautorenmodus geöffnet wurden. Stattdessen wird die Durchsetzung intern durch die Zusammengesetzte Dateiimplementierung behandelt.

Da der IStorage-Zeiger während des Marshalings an einen anderen Prozess übergeben wird, ist es möglich, zwei Prozesse gleichzeitigen Zugriff auf dieselbe zusammengesetzte Datei zu haben. Obwohl ein Anrufer möglicherweise exklusiven Schreibzugriff auf den Speicher erhalten hat, indem IDirectWriterLock::WaitForWriteAccess aufgerufen wird, kann die marshalierte Version auch gleichzeitig Zugriff haben. Die marshalierten Versionen müssen nicht geschlossen werden, während der einzelne Autor auf die Datei zugreift. In diesem Fall synchronisiert die Zusammengesetzte Dateiimplementierung die Schreibvorgänge intern.

Wenn ein einzelner Autor exklusiven Zugriff erhält, indem er aufruft, hat IDirectWriterLock::WaitForWriteAccess auch den Schreibzugriff und muss nicht IDirectWriterLock ::WaitForWriteAccess aufrufen. Beide Prozesse verfügen über Schreibzugriff und Synchronisierung werden durch die interne Zusammengesetzte Dateiimplementierung gesteuert.

IDirectWriterLock