IDirectWriterLock-复合文件实现

IDirectWriterLock的复合文件实现提供了一种在直接模式下使用单个编写器和多个读取器打开复合文件的方法。

可以使用 STGM 直接标志在直接模式下打开复合文件 _ 。 IDirectWriterLock接口将 STGM _ READWRITE | STGM _ 共享 _ 拒绝 _ 写入标志设置为在直接模式下有效,而无需快照副本的开销。

当使用 STGM 事务处理标志在事务模式下打开复合文件时 _ ,还可以使用多个读取器和单个编写器,使用 STGM _ READWRITE | STGM _ 共享 _ 拒绝 _ 写入标志。 但是,在这种情况下,将为读取器创建文件的快照副本。 暂存副本通常会产生额外的开销。

何时使用

在直接模式下打开存储时,使用系统提供的 IDirectWriterLock 实现 (STGM _ DIRECT) 与 STGM _ READWRITE | STGM _ SHARE _ DENY _ 写入标志。

若要获取指向 IDirectWriterLock的指针,请对 IStorage调用 QueryInterface 以获取复合文件的根存储对象。

调用 IDirectWriterLock:: WaitForWriteAccess 以获取对复合文件的独占写入访问权限。 调用 IDirectWriterLock:: ReleaseWriteAccess 以释放独占写入访问权限。

IDirectWriterLock:: HaveWriteAccess 指示文件当前是否处于锁定状态。

备注

单个编写器、多读取器功能的复合文件实现基于范围锁定。 编写器获取对存储的独占访问权限,以便在所有当前读取器关闭存储后写入该存储。 如果编写器处于活动状态,后续读取器将无法打开存储。 编写器调用 IDirectWriterLock:: WaitForWriteAccess 以获取独占写入访问权限。 然后,编写器必须调用 IDirectWriterLock:: ReleaseWriteAccess 以释放存储。

在此单一读取器、多个编写器模式下写入之前,需要对 IDirectWriterLock:: WaitForWriteAccess 的调用。 尝试在不调用 IDirectWriterLock:: WaitForWriteAccess 的情况下写入文件会导致 Stg.<name _ E _ ACCESSDENIED。 即使编写器最初打开文件,并且没有读取器当前打开该文件,也会返回此错误。

封送注意事项

自定义封送处理通常在将复合文件封送到同一台计算机上的其他进程时使用。 当封送处理存储时,不会考虑访问权限,并且会将 IStorage 指针传递到具有与原始封送处理过程相同的访问模式和权限的新进程。 有关访问模式的详细信息,请参阅 STGM 常量。 在封送处理期间,不会进行任何锁定或验证,以确保独占写入访问权限。 在这种情况下,不会对在单个编写器、多读取器模式下打开的复合文件强制实施单一编写器策略。 相反,强制由复合文件实现内部处理。

由于 IStorage 指针在封送处理期间传递到另一个进程,因此两个进程可以同时访问同一复合文件。 即使调用方可能已通过调用 IDirectWriterLock:: WaitForWriteAccess获取了对存储的独占写入访问权限,封送处理的版本也可以同时拥有访问权限。 当单个编写器访问文件时,不会强制关闭已封送的版本。 在这种情况下,复合文件实现在内部同步写入操作。

如果单个编写器通过调用、 IDirectWriterLock:: WaitForWriteAccess获取独占访问权限,则封送存储还具有写入访问权限,并且不必调用 IDirectWriterLock:: WaitForWriteAccess。 这两个进程都具有写入访问权限,同步由内部复合文件实现控制。

IDirectWriterLock