IDirectWriterLock - 复合文件实现

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

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

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

何时使用

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