IDirectWriterLock - 复合文件实现

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

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

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

何时使用

使用 STGM_READWRITE 以直接模式打开存储时,请使用系统提供的 IDirectWriterLock 实现 (STGM_DIRECT) |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