Auf Englisch lesen

Freigeben über


IDirectWriterLock – Implementierung zusammengesetzter Dateien

Die Implementierung von zusammengesetzten Dateien von IDirectWriterLock bietet eine Möglichkeit, eine zusammengesetzte Datei im direkten Modus mit einem einzelnen Writer und mehreren Readern zu öffnen.

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

Wenn eine zusammengesetzte Datei im Transaktionsmodus mit dem STGM_TRANSACTED-Flag geöffnet wird, können Sie auch mehrere Reader und einen einzelnen Writer verwenden, die den STGM_READWRITE| STGM_SHARE_DENY_WRITE Flag. In diesem Fall wird jedoch eine Momentaufnahme Kopie der Datei für die Leser erstellt. Es gibt oft mehr Aufwand für eine Kratzkopie.

Einsatzgebiet

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

Um einen Zeiger auf IDirectWriterLock zu erhalten, 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 zu erhalten. Rufen Sie IDirectWriterLock::ReleaseWriteAccess auf, um den exklusiven Schreibzugriff freizugeben.

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

Bemerkungen

Die Implementierung der zusammengesetzten Datei des Features mit mehreren Readern mit nur einem Writer basiert auf der Bereichssperre. Der Writer erhält exklusiven Zugriff auf den Speicher zum Schreiben, nachdem alle aktuellen Reader den Speicher geschlossen haben. Während der Writer aktiv ist, können nachfolgende Leser den Speicher nicht öffnen. Der Writer ruft IDirectWriterLock::WaitForWriteAccess auf, um exklusiven Schreibzugriff zu erhalten. Der Writer muss dann IDirectWriterLock::ReleaseWriteAccess aufrufen, um den Speicher freizugeben.

Der Aufruf von IDirectWriterLock::WaitForWriteAccess ist erforderlich, bevor Sie in diesem Modus mit mehreren Schreibvorgängen mit nur einem Reader schreiben. Versuche, in die Datei zu schreiben, ohne IDirectWriterLock::WaitForWriteAccess aufzurufen, führen zuerst zu STG_E_ACCESSDENIED. Dieser Fehler wird auch dann zurückgegeben, wenn der Writer die Datei anfangs geöffnet hat und die Datei derzeit nicht geöffnet ist.

Marshallingüberlegungen

Benutzerdefiniertes Marshalling wird in der Regel verwendet, wenn eine zusammengesetzte Datei in einen anderen Prozess auf demselben Computer gemarst wird. Beim Marshallen von Speicher werden Die Zugriffsrechte nicht berücksichtigt, und der IStorage-Zeiger wird an den neuen Prozess mit den gleichen Zugriffsmodi und Rechten wie der ursprüngliche Marshallvorgang übergeben. Weitere Informationen zu Zugriffsmodi finden Sie unter STGM-Konstanten. Während des Marshallvorgangs werden keine Sperren vorgenommen oder überprüft, um den exklusiven Schreibzugriff sicherzustellen. In diesem Fall gibt es keine Erzwingung der Single-Writer-Richtlinie für zusammengesetzte Dateien, die im Einzelschreibmodus mit mehreren Readern geöffnet werden. Stattdessen wird die Erzwingung intern von der Zusammengesetzten Dateiimplementierung behandelt.

Da der IStorage-Zeiger während des Marshallvorgangs an einen anderen Prozess übergeben wird, ist es möglich, dass zwei Prozesse gleichzeitig zugriff auf dieselbe zusammengesetzte Datei haben. Auch wenn ein Aufrufer durch Aufrufen von IDirectWriterLock::WaitForWriteAccess exklusiven Schreibzugriff auf den Speicher erhalten hat, kann die gemarselte Version auch gleichzeitig Zugriff haben. Die gemarselten Versionen müssen nicht geschlossen werden, während der einzelne Writer auf die Datei zugreift. In diesem Fall synchronisiert die Implementierung der zusammengesetzten Datei die Schreibvorgänge intern.

Wenn ein einzelner Writer den exklusiven Zugriff erhält, indem er IDirectWriterLock::WaitForWriteAccess aufruft, hat der gemarselte Speicher auch Schreibzugriff und muss IDirectWriterLock::WaitForWriteAccess nicht aufrufen. Beide Prozesse verfügen über Schreibzugriff, und die Synchronisierung wird von der implementierung der internen zusammengesetzten Datei gesteuert.

IDirectWriterLock