IDirectWriterLock - 复合文件实现

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

可以使用STGM_DIRECT标志以直接模式打开复合文件。 IDirectWriterLock 接口设置STGM_READWRITE|STGM_SHARE_DENY_WRITE标志在直接模式下有效,无需快照复制开销。

使用 STGM_TRANSACTED 标志在事务模式下打开复合文件时,还可以使用 STGM_READWRITE 具有多个读取器和单个编写器|STGM_SHARE_DENY_WRITE标志。 但是,在这种情况下,将为读取者创建文件的快照副本。 暂存副本通常会产生开销。

何时使用

使用 STGM_READWRITE 以直接模式(STGM_DIRECT)打开存储时,使用 IDirectWriterLock 的系统提供的实现|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 指针在封送过程中传递给另一个进程,因此两个进程可以同时访问同一复合文件。 尽管调用方可能通过调用 IDirectWriterLock::WaitForWriteAccess获取对存储的独占写入访问权限,但封送版本也可以同时具有访问权限。 在单个编写器访问文件时,封送版本不会被迫关闭。 在这种情况下,复合文件实现会在内部同步写入。

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

IDirectWriterLock