Partilhar via


Implementação do arquivo IStorage-Compound

A implementação de arquivo composto do IStorage permite criar e gerenciar subarmazenamentos e fluxos dentro de um objeto de armazenamento residente em um objeto de arquivo composto. Para criar um objeto de arquivo composto e obter um ponteiro IStorage , chame a função API StgCreateStorageEx. Para abrir um objeto de arquivo composto existente e obter sua raiz ponteiro IStorage, chame StgOpenStorageEx.

Os aplicativos que usam armazenamento composto devem ser registrados no HKEY_CLASSES_ROOT\SystemFileAssociations e devem fornecer seus próprios manipuladores de propriedade. Para obter mais informações, consulte a seção "Registrando verbos e outras informações de associação de arquivo" do Application Registration.

Quando usar

A maioria dos aplicativos usa essa implementação para criar e gerenciar armazenamentos e fluxos.

Metodologia

IStorage::CreateStream

Cria e abre um objeto de fluxo com o nome especificado contido nesse objeto de armazenamento. O nome não deve exceder 31 caracteres de comprimento (não incluindo o terminador de cadeia de caracteres). Os caracteres 000 a 01f, servindo como o primeiro caractere do nome do fluxo/armazenamento, são reservados para uso pelo OLE. Esta é uma restrição de arquivo composta, não uma restrição de armazenamento estruturado. A implementação de arquivo composto fornecido por COM do métodoIStorage::CreateStreamnão suporta os seguintes comportamentos:

  • O sinalizador STGM_DELETEONRELEASE não é suportado.
  • O modo transacionado (STGM_TRANSACTED) não é suportado para objetos de fluxo.
  • Não há suporte para abrir o mesmo fluxo mais de uma vez a partir do mesmo armazenamento. O sinalizador de modo de compartilhamento STGM_SHARE_EXCLUSIVE deve ser especificado no parâmetro grfMode.

IStorage::OpenStream

Abre um objeto de fluxo existente dentro desse objeto de armazenamento usando os modos de acesso especificados no parâmetro grfMode. Os caracteres 000 a 01f, servindo como o primeiro caractere do nome do fluxo/armazenamento, são reservados para uso pelo OLE. Esta é uma restrição de arquivo composta, não uma restrição de armazenamento estruturado. A implementação de arquivo composto fornecido COM do IStorage::OpenStream método não suporta o seguinte comportamento:

  • A bandeira STGM_DELETEONRELEASE.
  • Modo transacionado (STGM_TRANSACTED) para objetos de fluxo.
  • Abrir o mesmo fluxo mais de uma vez a partir do mesmo armazenamento. O sinalizador STGM_SHARE_EXCLUSIVE deve ser especificado.

IStorage::CreateStorage

Cria e abre um novo objeto de armazenamento com o nome especificado no modo de acesso especificado. O nome não deve exceder 31 caracteres de comprimento (não incluindo o terminador de cadeia de caracteres). Os caracteres 000 a 01f, servindo como o primeiro caractere do nome do fluxo/armazenamento, são reservados para uso pelo OLE. Esta é uma restrição de arquivo composta, não uma restrição de armazenamento estruturado. A implementação de arquivo composto fornecido COM do IStorage::CreateStorage método não suporta o seguinte comportamento:

  • O sinalizador STGM_PRIORITY para armazenamentos não raiz.
  • Abrir o mesmo objeto de armazenamento mais de uma vez a partir do mesmo armazenamento pai. O sinalizador STGM_SHARE_EXCLUSIVE deve ser especificado.
  • A bandeira STGM_DELETEONRELEASE. Se esse sinalizador for especificado, a função retornará STG_E_INVALIDFLAG.

IStorage::OpenStorage

Abre um objeto de armazenamento existente com o nome especificado no modo de acesso especificado. Os caracteres 000 a 01f, servindo como o primeiro caractere do nome do fluxo/armazenamento, são reservados para uso pelo OLE. Esta é uma restrição de arquivo composta, não uma restrição de armazenamento estruturado. A implementação de arquivo composto fornecido COM do IStorage::OpenStorage método não suporta o seguinte comportamento:

  • O sinalizador STGM_PRIORITY para armazenamentos não raiz.
  • Abrir o mesmo objeto de armazenamento mais de uma vez a partir do mesmo armazenamento pai. O sinalizador STGM_SHARE_EXCLUSIVE deve ser especificado.
  • A bandeira STGM_DELETEONRELEASE. Se esse sinalizador for especificado, a função retornará STG_E_INVALIDFUNCTION.

IStorage::CopyTo

Copia apenas os subarmazenamentos e fluxos desse objeto de armazenamento aberto para outro objeto de armazenamento. O parâmetro rgiidExclude pode ser definido como IID_IStream para copiar apenas subarmazenamentos ou IID_IStorage para copiar apenas fluxos.

IStorage::MoveElementTo

Copia ou move um subarmazenamento ou fluxo desse objeto de armazenamento para outro objeto de armazenamento.

IStorage::Commit

Garante que todas as alterações feitas em um objeto de armazenamento aberto no modo transacionado sejam refletidas no armazenamento pai; para um armazenamento root, reflete as mudanças no dispositivo real; por exemplo, um arquivo no disco. Para um objeto de armazenamento raiz aberto no modo direto, esse método não tem efeito, exceto para liberar todos os buffers de memória para o disco. Para objetos de armazenamento não raiz no modo direto, esse método não tem efeito.

A implementação de arquivos compostos fornecidos pelo COM usa um processo de confirmação de duas fases, a menos que STGC_OVERWRITE seja especificado no parâmetro grfCommitFlags. Este processo em duas fases garante a robustez dos dados, caso a operação de confirmação falhe. Primeiro, todos os novos dados são gravados no espaço não utilizado no arquivo subjacente. Se necessário, um novo espaço é alocado para o arquivo. Após a conclusão desta etapa, uma tabela no arquivo é atualizada usando uma operação de gravação de setor único para indicar que os novos dados devem ser usados no lugar dos antigos. Os dados antigos tornam-se espaço livre para serem usados na próxima operação de confirmação. Assim, os dados antigos estão disponíveis e podem ser restaurados se ocorrer um erro ao cometer alterações. Se STGC_OVERWRITE for especificado, uma operação de confirmação de fase única será usada. Para obter mais informações sobre sinalizadores de modo transacionado, consulte STGC enumeração.

IStorage::Reverter

Descarta todas as alterações feitas no objeto de armazenamento desde a última operação de confirmação.

IStorage::EnumElements

Cria e recupera um ponteiro para um objeto enumerador que pode ser usado para enumerar os objetos de armazenamento e fluxo contidos nesse objeto de armazenamento. A implementação do arquivo composto fornecido pelo COM tira um instantâneo dessas informações. Portanto, as alterações nos fluxos e armazenamentos não são refletidas no enumerador até que um novo enumerador seja obtido.

IStorage::D estroyElement

Remove o elemento especificado (subarmazenamento ou fluxo) desse objeto de armazenamento.

IStorage::RenameElement

Renomeia o subarmazenamento ou fluxo especificado neste objeto de armazenamento. Os caracteres 000 a 01f, servindo como o primeiro caractere do nome do fluxo/armazenamento, são reservados para uso pelo OLE. Esta é uma restrição de arquivo composta, não uma restrição de armazenamento estruturado.

IStorage::SetElementTimes

Define os tempos de modificação, acesso e criação do elemento de armazenamento especificado. A implementação de arquivo composto fornecida pelo COM mantém os tempos de modificação e alteração para objetos de armazenamento interno. Os objetos de armazenamento raiz suportam tudo o que é suportado pelo sistema de arquivos subjacente (ou por ILockBytes). A implementação do arquivo composto não mantém nenhum carimbo de data/hora para fluxos internos. Os carimbos de data/hora sem suporte são relatados como zero, o que permite que o chamador teste o suporte.

IStorage::SetClass

Atribui o CLSID especificado a este objeto de armazenamento.

IStorage::SetStateBits

Armazena até 32 bits de informações de estado neste objeto de armazenamento. O estado definido por este método é apenas para uso externo. A implementação do arquivo composto fornecido pela COM não executa nenhuma ação com base no estado.

IStorage::Stat

Recupera a estruturaSTATSTG para esse objeto de armazenamento aberto.

Comentários

Se o objeto de armazenamento for aberto no modo simples, o uso dos métodos acima é restrito. Um armazenamento estará no modo simples se for aberto com o elemento STGM_SIMPLE especificado no parâmetro grfMode da função StgCreateStorageEx ou função StgOpenStorageEx. Para obter mais informações sobre armazenamentos de modo simples, consulte Constantes STGM. Se o objeto de armazenamento de modo simples foi obtido a partir da função StgCreateStorageEx, o métodoCreateStream pode ser chamado, mas o método OpenStream não pode. Se o objeto de armazenamento de modo simples foi obtido a partir da função StgOpenStorageEx, o método OpenStream pode ser chamado, mas o método CreateStream não pode.

Quando um objeto de armazenamento de modo simples é usado para criar um fluxo, o tamanho mínimo desse fluxo normalmente é de 4096 bytes. Se menos dados forem gravados no fluxo, o tamanho será arredondado para 4096 bytes.

Limites de implementação de arquivos compostos

IFillLockBytes

ILockBytes

IRootStorage

IStorage

IStream

StgCreateDocfile

StgCreateStorageEx

StgOpenStorage

StgOpenStorageEx