Partilhar via


IDirectWriterLock - Implementação de arquivo composto

A implementação de arquivo composto do 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 de 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 bandeira. No entanto, neste caso, uma cópia instantânea do arquivo é feita para os leitores. Muitas vezes há sobrecarga de uma cópia de rascunho.

Quando usar

Use a implementação fornecida pelo sistema do IDirectWriterLock quando abrir um armazenamento em modo direto (STGM_DIRECT) com o STGM_READWRITE|STGM_SHARE_DENY_WRITE bandeiras.

Para obter um ponteiro para IDirectWriterLock, chame QueryInterface em IStorage para obter o objeto de armazenamento raiz para o 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 leitor múltiplo é baseada no bloqueio de intervalo. O gravador obtém acesso exclusivo ao armazenamento para escrever depois de todos os leitores atuais terem fechado 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. O gravador deve então chamar IDirectWriterLock::ReleaseWriteAccess para liberar o armazenamento.

A chamada para IDirectWriterLock::WaitForWriteAccess é necessária antes de escrever neste modo de leitor único e vários gravadores. Tentativas de gravar no arquivo sem chamar IDirectWriterLock::WaitForWriteAccess primeiro resultado em STG_E_ACCESSDENIED. Este erro é retornado mesmo se o gravador abriu o arquivo inicialmente e nenhum leitor atualmente tem o arquivo aberto.

Considerações sobre o marshaling

O marshaling personalizado é normalmente usado quando um arquivo composto é empacotado para outro processo na mesma máquina. Ao empacotar armazenamentos, os direitos de acesso não são considerados, e o ponteiro deIStorageé passado para o novo processo com os mesmos modos de acesso e direitos que o processo de empacotamento original. Para obter mais informações sobre modos de acesso, consulte constantes STGM. Durante o marshaling, nenhum bloqueio é tomado ou verificado para garantir acesso exclusivo de gravação. Nesse caso, não há imposição da política de gravador único para arquivos compostos abertos no modo de gravador único e leitor múltiplo. Em vez disso, a imposição é tratada internamente pela implementação do 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. Mesmo que um chamador possa ter obtido acesso de gravação exclusivo ao armazenamento chamando IDirectWriterLock::WaitForWriteAccess, a versão empacotada também pode ter acesso simultaneamente. As versões empacotadas não são forçadas a fechar enquanto o único gravador acessa o arquivo. Nesse caso, a implementação do arquivo composto sincroniza as gravações internamente.

Se um único gravador obtiver acesso exclusivo chamando, IDirectWriterLock::WaitForWriteAccess, o armazenamento empacotado 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 interna do arquivo composto.

IDirectWriterLock