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 interfaz IDirectWriterLock 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 de instantánea del archivo para los lectores. A menudo hay una sobrecarga de una copia temporal.

Casos en los que se debe usar

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

Para obtener un puntero a IDirectWriterLock, llame a QueryInterface en 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 archivo compuesto 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 lector único y de múltiples escrituras. Intenta escribir en el archivo sin llamar al primer resultado de IDirectWriterLock::WaitForWriteAccess 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

Las referencias personalizadas se usan normalmente cuando un archivo compuesto se serializa en otro proceso de la misma máquina. Al serializar almacenamientos, no se tienen en cuenta los derechos de acceso y el puntero IStorage 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 StGM Constants. 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 escritor único para los archivos compuestos abiertos en el modo de varios lectores y escritor único. En su lugar, la implementación del archivo compuesto controla el cumplimiento internamente.

Dado que el puntero IStorage se pasa a otro proceso durante la serialización, es posible que dos procesos tengan acceso simultáneo al mismo archivo compuesto. Aunque un llamador puede haber obtenido acceso de escritura exclusivo al almacenamiento mediante una llamada a IDirectWriterLock::WaitForWriteAccess, la versión serializado 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 la sincronización se controla mediante la implementación del archivo compuesto interno.

IDirectWriterLock