Compartilhar via


IDirectWriterLock – Implementação de arquivo composto

A implementação de arquivo composto de IDirectWriterLock fornece uma maneira de abrir um arquivo composto no modo direto com um único gravador e vários leitores.

Arquivos compostos podem ser abertos no modo direto usando o sinalizador STGM_DIRECT. A interface IDirectWriterLock define o STGM_READWRITE| STGM_SHARE_DENY_WRITE sinalizador como válido no modo direto sem exigir a sobrecarga de uma cópia instantâneo.

Quando um arquivo composto é aberto no modo transacionado usando o sinalizador STGM_TRANSACTED, você também pode ter vários leitores e um único gravador usando o STGM_READWRITE| STGM_SHARE_DENY_WRITE sinalizador. No entanto, nesse caso, uma cópia instantâneo do arquivo é feita para os leitores. Geralmente, há sobrecarga de uma cópia de rascunho.

Quando usar

Use a implementação fornecida pelo sistema de IDirectWriterLock ao abrir um armazenamento no modo direto (STGM_DIRECT) com o STGM_READWRITE| STGM_SHARE_DENY_WRITE sinalizadores.

Para obter um ponteiro para IDirectWriterLock, chame QueryInterface no IStorage para obter o objeto de armazenamento raiz do arquivo composto.

Chame IDirectWriterLock::WaitForWriteAccess para obter acesso de gravação exclusivo a um arquivo composto. Chame IDirectWriterLock::ReleaseWriteAccess para liberar acesso de gravação exclusivo.

IDirectWriterLock::HaveWriteAccess indica se o arquivo está bloqueado no momento.

Comentários

A implementação de arquivo composto do recurso de gravador único e de vários leitores baseia-se no bloqueio de intervalo. O gravador obtém acesso exclusivo ao armazenamento a ser gravado depois que todos os leitores atuais fecharam o armazenamento. Enquanto o gravador estiver ativo, os leitores subsequentes não poderão abrir o armazenamento. O gravador chama IDirectWriterLock::WaitForWriteAccess para obter acesso de gravação exclusivo. Em seguida, o gravador deve chamar IDirectWriterLock::ReleaseWriteAccess para liberar o armazenamento.

A chamada para IDirectWriterLock::WaitForWriteAccess é necessária antes de ser escrita neste modo de leitor único e de vários gravadores. Tenta gravar no arquivo sem chamar IDirectWriterLock::WaitForWriteAccess primeiro resulta em STG_E_ACCESSDENIED. Esse erro será retornado mesmo que o gravador tenha aberto o arquivo inicialmente e nenhum leitor tenha o arquivo aberto no momento.

Considerações sobre marshaling

O marshaling personalizado normalmente é usado quando um arquivo composto é realizado em marshaling para outro processo no mesmo computador. Ao realizar marshaling de armazenamentos, os direitos de acesso não são considerados e o ponteiro IStorage é passado para o novo processo com os mesmos modos de acesso e direitos que o processo de marshaling original. Para obter mais informações sobre modos de acesso, consulte Constantes STGM. Durante o marshaling, nenhum bloqueio é feito ou verificado para garantir o acesso de gravação exclusivo. Nesse caso, não há imposição da política de gravador único para arquivos compostos abertos no modo de gravador único e de vários leitores. Em vez disso, a imposição é tratada internamente pela implementação de arquivo composto.

Como o ponteiro IStorage é passado para outro processo durante o marshaling, é possível que dois processos tenham acesso simultâneo ao mesmo arquivo composto. Embora um chamador possa ter obtido acesso de gravação exclusivo ao armazenamento chamando IDirectWriterLock::WaitForWriteAccess, a versão marshaled também pode ter acesso simultaneamente. As versões marshaled não são forçadas a fechar enquanto o único gravador acessa o arquivo. Nesse caso, a implementação de arquivo composto sincroniza as gravações internamente.

Se um único gravador obtiver acesso exclusivo chamando IDirectWriterLock::WaitForWriteAccess, o armazenamento marshaled também terá acesso de gravação e não precisará chamar IDirectWriterLock::WaitForWriteAccess. Ambos os processos têm acesso de gravação e a sincronização é controlada pela implementação de arquivo composto interno.

IDirectWriterLock