Compartilhar via


Implementação autônoma do IPropertyStorage

A implementação autônoma fornecida pelo sistema de IPropertySetStorage inclui uma implementação de IPropertyStorage, a interface que lê e grava propriedades em um armazenamento de conjunto de propriedades. A interface IPropertySetStorage cria e abre conjuntos de propriedades em um armazenamento. As interfacesIEnumSTATPROPSTGeIEnumSTATPROPSETSTG também são fornecidas na implementação autônoma.

Para obter um ponteiro para a implementação autônoma de IPropertyStorage, chame a função StgCreatePropStg para criar um novo conjunto de propriedades ou StgOpenPropStg obter o ponteiro de interface em um conjunto de propriedades existente (ou chamar os métodos Create ou Open da implementação autônoma IPropertySetStor age).

A implementação autônoma de IPropertyStorage cria conjuntos de propriedades em qualquer objeto de armazenamento ou fluxo, não apenas em fluxos e armazenamentos de arquivos compostos. A implementação autônoma não depende de arquivos compostos e pode ser usada com qualquer implementação de armazenamentos estruturados. Para obter mais informações sobre a implementação de arquivo composto dessa interface, consulte IPropertyStorage-Compoundde Implementação de Arquivo.

Quando usar

Use IPropertyStorage para gerenciar propriedades em um único conjunto de propriedades. Seus métodos dão suporte à leitura, gravação e exclusão de propriedades e nomes de cadeia de caracteres opcionais que podem ser associados a IDs de propriedade. Outros métodos dão suporte à confirmação padrão e revertem as operações de armazenamento. Há também um método que define horários associados ao armazenamento de propriedades e outro que permite que a atribuição de um CLSID seja usada para associar outro código, como o código da interface do usuário, ao conjunto de propriedades. O método Enum fornece um ponteiro para a implementação autônoma de IEnumSTATPROPSTG, que enumera as propriedades no conjunto.

Formatos de conjunto de propriedades versão 0 e versão 1

A implementação autônoma do IPropertyStorage dá suporte aos formatos de serialização do conjunto de propriedades versão 0 e versão 1. Para obter mais informações, consulte de serialização do conjunto de propriedades. Os conjuntos de propriedades são criados no formato versão 0 e permanecem nesse formato, a menos que novos recursos sejam solicitados. Nesse momento, o formato é atualizado para a versão 1.

Por exemplo, se um conjunto de propriedades for criado com o sinalizador PROPSETFLAG_DEFAULT, seu formato será a versão 0. Desde que os tipos de propriedade que estejam em conformidade com o formato da versão 0 sejam gravados e lidos desse conjunto de propriedades, o conjunto de propriedades permanecerá no formato de versão 0. Se um tipo de propriedade versão 1 for gravado no conjunto de propriedades, o conjunto de propriedades será atualizado automaticamente para a versão 1. Posteriormente, esse conjunto de propriedades não pode mais ser lido por implementações que só entendem a versão 0.

Tipos IPropertyStorage e Variant

A implementação autônoma doIPropertyStoragenão dá suporte aos tipos variantes VT_UNKNOWN ou VT_DISPATCH no membro vt da estruturaPROPVARIANT.

Os tipos de variante a seguir têm suporte em um SafeArray; ou seja, esses valores podem ser combinados com VT_ARRAY no vt membro da estruturaPROPVARIANT.

Tipos variant com suporte no SafeArray pela implementação de arquivo composto de IPropertyStorage

VT_I1

VT_UI1

VT_I2

VT_UI2

VT_I4

VT_UI4

VT_INT

VT_UINT

VT_R4

VT_R8

VT_CY

VT_DATE

VT_BSTR

VT_BOOL

VT_DECIMAL

VT_ERROR

VT_VARIANT

 

 

Quando VT_VARIANT é combinado com VT_ARRAY, o próprio SafeArray mantém estruturas de PROPVARIANT. No entanto, os tipos desses elementos devem ser retirados da lista anterior, não podem ser VT_VARIANT e não podem incluir os indicadores VT_VECTOR, VT_ARRAY ou VT_BYREF.

Métodos IPropertyStorage

A implementação autônoma do IPropertyStorage dá suporte aos seguintes métodos:

IPropertyStorage::ReadMultiple

Lê as propriedades especificadas na matriz de rgpspec e fornece os valores de todas as propriedades válidas na matriz rgvar de elementos PROPVARIANT.

Na implementação autônoma fornecida pelo sistema, identificadores de propriedade duplicados que se referem a tipos de fluxo ou armazenamento resultam em várias chamadas para IStorage::OpenStream ou IStorage::OpenStorage e o êxito ou falha de ReadMultiple depende da capacidade da implementação de armazenamento subjacente de compartilhar armazenamentos abertos.

Além disso, para garantir a operação thread-safe se a mesma propriedade com valor de fluxo ou armazenamento for solicitada várias vezes por meio do mesmo ponteiro de IPropertyStorage, a abertura terá êxito ou falhará dependendo se a propriedade já está aberta ou não e se o sistema de arquivos subjacente manipula várias aberturas de um fluxo ou armazenamento. Assim, a operaçãoReadMultiple em uma propriedade com valor de fluxo ou armazenamento sempre resulta em uma chamada para IStorage::OpenStreamou IStorage::OpenStorage, passando o acesso (STGM_READWRITE, por exemplo) e compartilhando valores (STGM_SHARE_EXCLUSIVE, por exemplo) especificados quando o conjunto de propriedades foi originalmente aberto ou criado.

Se o método falhar, os valores gravados em rgvar[] serão indefinidos. Se algumas propriedades com valor de fluxo ou armazenamento forem abertas com êxito, mas ocorrer um erro antes da execução ser concluída, essas propriedades deverão ser liberadas antes que o método retorne.

IPropertyStorage::WriteMultiple

Grava as propriedades especificadas na matriz rgpspec [], atribuindo-lhes as marcas e valoresPROPVARIANTespecificados em rgvar[]. As propriedades que já existem recebem os valores PROPVARIANT especificados e as propriedades que não existem atualmente são criadas.

IPropertyStorage::D eleteMultiple

Exclui as propriedades especificadas no rgpspec[].

IPropertyStorage::ReadPropertyNames

Lê os nomes de cadeia de caracteres existentes associados às IDs de propriedade especificadas na matriz [] rgpropid.

IPropertyStorage::WritePropertyNames

Atribui nomes de cadeia de caracteres especificados na matriz rglpwstrName às IDs de propriedade especificadas na matriz rgpropid.

IPropertyStorage::D eletePropertyNames

Exclui os nomes de cadeia de caracteres das IDs de propriedade especificadas na matriz de rgpropid gravando NULL no nome da propriedade.

IPropertyStorage::SetClass

Define o CLSID do fluxo do conjunto de propriedades. Na implementação autônoma, a configuração do CLSID em um conjunto de propriedades não simplificadas (que pode conter propriedades com valor de armazenamento ou fluxo, conforme descrito em IPropertySetStorage::Create) também define o CLSID no substorage subjacente para que possa ser obtido por meio de uma chamada para IStorage::Stat.

IPropertyStorage::Commit

Para conjuntos de propriedades simples e não simplificados, libera a imagem de memória para o subsistema de disco. Além disso, para conjuntos de propriedades de modo transacted não simplificados, esse método chama IStorage::Commit no conjunto de propriedades.

IPropertyStorage::Revert

Somente para conjuntos de propriedades não simplificados, chama o método Reverter do armazenamento subjacente e reabre o fluxo de "conteúdo". Para conjuntos de propriedades simples, retorna apenas E_OK.

IPropertyStorage::Enum

Cria um objeto enumerador que implementa IEnumSTATPROPSTG, os métodos dos quais podem ser chamados para enumerar as estruturasSTATPROPSTGque fornecem informações sobre cada uma das propriedades no conjunto.

Essa implementação cria uma matriz na qual todo o conjunto de propriedades é lido e que pode ser compartilhado quando IEnumSTATPROPSTG::Clone é chamado.

IPropertyStorage::Stat

Preenche os membros de uma estrutura deSTATPROPSETSTG, que contém informações sobre a propriedade definida como um todo. No retorno, fornece um ponteiro para a estrutura.

Para conjuntos de armazenamento não simplificados, essa implementação chama IStorage::Stat (ou IStream::Stat) para obter as informações do armazenamento ou fluxo subjacente.

IPropertyStorage::SetTimes

Somente para conjuntos de propriedades não simplificados, define os horários compatíveis com o armazenamento subjacente. Essa implementação de SetTimes chama o método IStorage::SetElementTimes do armazenamento subjacente para modificar os horários. Ele dá suporte aos tempos compatíveis com o método subjacente que podem ser tempo de modificação, hora de acesso ou hora de criação.

implementação autônoma do IPropertySetStorage

IPropertyStorage

IStorage::SetElementTimes

StgOpenPropStg

stgCreatePropStg

stgCreatePropSetStg