Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 interfaceIDirectWriterLockdefine 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|sinalizador STGM_SHARE_DENY_WRITE. No entanto, nesse caso, uma cópia de instantâneo do arquivo é feita para os leitores. Geralmente, há uma sobrecarga de uma cópia de rascunho.
Quando usar
Use a implementação fornecida pelo sistema de IDirectWriterLock quando você 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 em 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.
Observações
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 para gravar depois que todos os leitores atuais fecharam o armazenamento. Embora o gravador esteja ativo, os leitores subsequentes não podem 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 antes de escrever neste modo de leitor único e de vários gravadores. Tenta gravar no arquivo sem chamar IDirectWriterLock::WaitForWriteAccess primeiro resultado em STG_E_ACCESSDENIED. Esse erro é retornado mesmo se o gravador abriu o arquivo inicialmente e nenhum leitor atualmente tem o arquivo aberto.
Considerações sobre marshaling
O marshaling personalizado normalmente é usado quando um arquivo composto é empacotado para outro processo no mesmo computador. Ao realizar marshaling de armazenamentos, os direitos de acesso não são considerados e o ponteiroIStorage é 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á nenhuma 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 marshalada também pode ter acesso simultaneamente. As versões em 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 em 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.
Tópicos relacionados