Implementación independiente de IPropertyStorage

La implementación independiente proporcionada por el sistema de IPropertySetStorage incluye una implementación de IPropertyStorage, la interfaz que lee y escribe propiedades en un almacenamiento de conjunto de propiedades. La interfaz IPropertySetStorage crea y abre conjuntos de propiedades en un almacenamiento. Las interfaces IEnumSTATPROPSTG e IEnumSTATPROPSETSTG también se proporcionan en la implementación independiente.

Para obtener un puntero a la implementación independiente de IPropertyStorage, llame a la función StgCreatePropStg para crear un nuevo conjunto de propiedades o StgOpenPropStg para obtener el puntero de interfaz en un conjunto de propiedades existente (o llame a los métodos Create o Open de la implementación independiente de IPropertySetStorage ).

La implementación independiente de IPropertyStorage crea conjuntos de propiedades en cualquier objeto de flujo o almacenamiento, no solo en secuencias y almacenamientos de archivos compuestos. La implementación independiente no depende de los archivos compuestos y se puede usar con cualquier implementación de almacenamiento estructurado. Para obtener más información sobre la implementación de archivos compuestos de esta interfaz, vea IPropertyStorage-Compound File Implementation.

Casos en los que se debe usar

Use IPropertyStorage para administrar las propiedades dentro de un único conjunto de propiedades. Sus métodos admiten la lectura, escritura y eliminación de propiedades y los nombres de cadena opcionales que se pueden asociar a los identificadores de propiedad. Otros métodos admiten las operaciones estándar de confirmación y reversión del almacenamiento. También hay un método que establece las horas asociadas al almacenamiento de propiedades y otra que permite que la asignación de un CLSID se use para asociar otro código, como el código de interfaz de usuario, con el conjunto de propiedades. El método Enum proporciona un puntero a la implementación independiente de IEnumSTATPROPSTG, que enumera las propiedades del conjunto.

Formatos de conjunto de propiedades de la versión 0 y de la versión 1

La implementación independiente de IPropertyStorage admite tanto la versión 0 como los formatos de serialización del conjunto de propiedades de la versión 1. Para obtener más información, vea Serialización del conjunto de propiedades. Los conjuntos de propiedades se crean en formato de la versión 0 y permanecen en ese formato a menos que se soliciten nuevas características. En ese momento, el formato se actualiza a la versión 1.

Por ejemplo, si se crea un conjunto de propiedades con la marca PROPSETFLAG_DEFAULT, su formato es la versión 0. Siempre que los tipos de propiedad que cumplan el formato de la versión 0 se escriban y lean desde ese conjunto de propiedades, el conjunto de propiedades permanece en formato de versión 0. Si se escribe un tipo de propiedad de versión 1 en el conjunto de propiedades, el conjunto de propiedades se actualiza automáticamente a la versión 1. Posteriormente, ese conjunto de propiedades ya no se puede leer mediante implementaciones que solo comprenden la versión 0.

Tipos IPropertyStorage y Variant

La implementación independiente de IPropertyStorage no admite los tipos de variante VT_UNKNOWN o VT_DISPATCH en el miembro vt de la estructura PROPVARIANT .

Los siguientes tipos de variante se admiten dentro de safeArray; es decir, estos valores se pueden combinar con VT_ARRAY en el miembro vt de la estructura PROPVARIANT .

Tipos de variante admitidos en SafeArray mediante la implementación de archivos compuestos 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

 

 

Cuando VT_VARIANT se combina con VT_ARRAY, el propio SafeArray contiene estructuras PROPVARIANT . Sin embargo, los tipos de estos elementos se deben tomar de la lista anterior, no se pueden VT_VARIANT y no pueden incluir los indicadores de VT_VECTOR, VT_ARRAY o VT_BYREF.

Métodos IPropertyStorage

La implementación independiente de IPropertyStorage admite los métodos siguientes:

IPropertyStorage::ReadMultiple

Lee las propiedades especificadas en la matriz rgpspec y proporciona los valores de todas las propiedades válidas en la matriz rgvar de los elementos PROPVARIANT .

En la implementación independiente proporcionada por el sistema, los identificadores de propiedad duplicados que hacen referencia a los tipos de flujo o almacenamiento dan lugar a varias llamadas a IStorage::OpenStream o IStorage::OpenStorage y el éxito o error de ReadMultiple depende de la capacidad de la implementación de almacenamiento subyacente para compartir almacenamientos abiertos.

Además, para garantizar la operación segura para subprocesos si la misma propiedad con valores de flujo o almacenamiento se solicita varias veces a través del mismo puntero IPropertyStorage , la apertura se realizará correctamente o producirá un error en función de si la propiedad ya está abierta o si el sistema de archivos subyacente controla varias aperturas de una secuencia o almacenamiento. Por lo tanto, la operación ReadMultiple en una propiedad con valores de flujo o almacenamiento siempre da como resultado una llamada a IStorage::OpenStream o IStorage::OpenStorage, pasando el acceso (STGM_READWRITE, por ejemplo) y los valores de recurso compartido (STGM_SHARE_EXCLUSIVE, por ejemplo) especificados cuando el conjunto de propiedades se abrió o creó originalmente.

Si se produce un error en el método, los valores escritos en rgvar[] no están definidos. Si algunas propiedades con valores de almacenamiento o de secuencia se abren correctamente, pero se produce un error antes de que se complete la ejecución, estas propiedades se deben liberar antes de que el método devuelva.

IPropertyStorage::WriteMultiple

Escribe las propiedades especificadas en la matriz rgpspec[], asignándolas las etiquetas y valores PROPVARIANT especificados en rgvar[]. A las propiedades que ya existen se les asignan los valores PROPVARIANT especificados y se crean las propiedades que no existen actualmente.

IPropertyStorage::D eleteMultiple

Elimina las propiedades especificadas en rgpspec[].

IPropertyStorage::ReadPropertyNames

Lee los nombres de cadena existentes asociados a los identificadores de propiedad especificados en la matriz rgpropid[].

IPropertyStorage::WritePropertyNames

Asigna nombres de cadena especificados en la matriz rglpwstrName a los identificadores de propiedad especificados en la matriz rgpropid .

IPropertyStorage::D eletePropertyNames

Elimina los nombres de cadena de los identificadores de propiedad especificados en la matriz rgpropid escribiendo NULL en el nombre de propiedad.

IPropertyStorage::SetClass

Establece el CLSID de la secuencia del conjunto de propiedades. En la implementación independiente, al establecer el CLSID en un conjunto de propiedades nomple (uno que puede contener propiedades con valores de flujo o almacenamiento, como se describe en IPropertySetStorage::Create) también establece el CLSID en el substorage subyacente para que se pueda obtener mediante una llamada a IStorage::Stat.

IPropertyStorage::Commit

Para los conjuntos de propiedades simples y nomples, vacía la imagen de memoria en el subsistema de disco. Además, para los conjuntos de propiedades en modo transacted nomple, este método llama a IStorage::Commit en el conjunto de propiedades.

IPropertyStorage::Revert

En el caso de los conjuntos de propiedades nomples, llama al método Revert del almacenamiento subyacente y vuelve a abrir la secuencia "contents". Para conjuntos de propiedades simples, solo devuelve E_OK.

IPropertyStorage::Enum

Crea un objeto enumerador que implementa IEnumSTATPROPSTG, los métodos a los que se puede llamar para enumerar las estructuras STATPROPSTG que proporcionan información sobre cada una de las propiedades del conjunto.

Esta implementación crea una matriz en la que se lee todo el conjunto de propiedades y que se puede compartir cuando se llama a IEnumSTATPROPSTG::Clone .

IPropertyStorage::Stat

Rellena los miembros de una estructura STATPROPSETSTG , que contiene información sobre el conjunto de propiedades en su conjunto. A cambio, proporciona un puntero a la estructura .

En el caso de los conjuntos de almacenamiento nompleados, esta implementación llama a IStorage::Stat (o IStream::Stat) para obtener la información del almacenamiento o la secuencia subyacentes.

IPropertyStorage::SetTimes

En el caso de los conjuntos de propiedades nomples, establece las horas admitidas por el almacenamiento subyacente. Esta implementación de SetTimes llama al método IStorage::SetElementTimes del almacenamiento subyacente para modificar las horas. Admite las horas admitidas por el método subyacente que pueden ser la hora de modificación, la hora de acceso o la hora de creación.

Implementación independiente de IPropertySetStorage

IPropertyStorage

IStorage::SetElementTimes

StgOpenPropStg

StgCreatePropStg

StgCreatePropSetStg