Compartir a través de


IDirectWriterLock: implementación de archivos compuestos

La implementación de archivo compuesto de IDirectWriterLock proporciona una manera de abrir un archivo compuesto en modo directo con un único escritor y varios lectores.

Los archivos compuestos se pueden abrir en modo directo mediante la marca STGM_DIRECT. La interfazIDirectWriterLock establece el STGM_READWRITE|STGM_SHARE_DENY_WRITE marca como válida en modo directo sin requerir la sobrecarga de una copia de instantánea.

Cuando se abre un archivo compuesto en modo de transacción mediante la marca STGM_TRANSACTED, también puede tener varios lectores y un único escritor mediante el STGM_READWRITE|STGM_SHARE_DENY_WRITE marca. Sin embargo, en este caso, se realiza una copia instantánea del archivo para los lectores. A menudo hay una sobrecarga de una copia temporal.

Cuándo usar

Use la implementación proporcionada por el sistema de IDirectWriterLock al abrir un almacenamiento en modo directo (STGM_DIRECT) con el STGM_READWRITE|marcas de STGM_SHARE_DENY_WRITE.

Para obtener un puntero a IDirectWriterLock, llame a queryInterface en de IStorage para obtener el objeto de almacenamiento raíz para el archivo compuesto.

Llame a IDirectWriterLock::WaitForWriteAccess para obtener acceso de escritura exclusivo a un archivo compuesto. Llame a IDirectWriterLock::ReleaseWriteAccess para liberar acceso de escritura exclusivo.

IDirectWriterLock::HaveWriteAccess indica si el archivo está bloqueado actualmente.

Observaciones

La implementación de archivos compuestos de la característica de escritura única y de varios lectores se basa en el bloqueo de intervalos. El escritor obtiene acceso exclusivo al almacenamiento para escribir después de que todos los lectores actuales hayan cerrado el almacenamiento. Mientras el escritor está activo, los lectores posteriores no pueden abrir el almacenamiento. El escritor llama a IDirectWriterLock::WaitForWriteAccess para obtener acceso de escritura exclusivo. A continuación, el escritor debe llamar a IDirectWriterLock::ReleaseWriteAccess para liberar el almacenamiento.

La llamada a IDirectWriterLock::WaitForWriteAccess es necesaria antes de escribir en este modo de lectura único y multiescritura. Intenta escribir en el archivo sin llamar a IDirectWriterLock::WaitForWriteAccess primer resultado en STG_E_ACCESSDENIED. Este error se devuelve incluso si el escritor abrió el archivo inicialmente y no hay lectores abiertos actualmente.

Consideraciones de serialización

La serialización personalizada se usa normalmente cuando se serializa un archivo compuesto en otro proceso de la misma máquina. Al serializar los almacenamientos, no se tienen en cuenta los derechos de acceso y el IStorage puntero se pasa al nuevo proceso con los mismos modos de acceso y derechos que el proceso de serialización original. Para obtener más información sobre los modos de acceso, vea constantes STGM. Durante la serialización, no se toman ni comprueban bloqueos para garantizar el acceso exclusivo de escritura. En este caso, no hay ninguna aplicación de la directiva de un solo escritor para los archivos compuestos abiertos en el modo de varios lectores únicos. En su lugar, la implementación del archivo compuesto controla el cumplimiento internamente.

Dado que el IStorage puntero se pasa a otro proceso durante la serialización, es posible que dos procesos tengan acceso simultáneo al mismo archivo compuesto. Aunque un autor de la llamada haya obtenido acceso de escritura exclusivo al almacenamiento llamando a IDirectWriterLock::WaitForWriteAccess, la versión serialada también puede tener acceso simultáneamente. Las versiones serialadas no se ven obligadas a cerrarse mientras el escritor único accede al archivo. En este caso, la implementación del archivo compuesto sincroniza las escrituras internamente.

Si un único escritor obtiene acceso exclusivo mediante una llamada a , IDirectWriterLock::WaitForWriteAccess, el almacenamiento serializado también tiene acceso de escritura y no tiene que llamar a IDirectWriterLock::WaitForWriteAccess. Ambos procesos tienen acceso de escritura y sincronización se controlan mediante la implementación del archivo compuesto interno.

IDirectWriterLock