IPropertyStorage-独立实现

IPropertySetStorage 的系统独立实现 包括 IPropertyStorage实现,该接口读取和写入属性集存储中的属性。 IPropertySetStorage 接口创建并打开存储中的属性集。 独立实现中还提供了 IEnumSTATPROPSTGIEnumSTATPROPSETSTG 接口。

若要获取指向 IPropertyStorage的独立实现的指针,请调用 StgCreatePropStg 函数创建新的属性集或 StgOpenPropStg 获取现有属性集上的接口指针(或调用 CreateOpen 方法 IPropertySetStorage 独立实现)。

IPropertyStorage 的独立实现 在任何存储或流对象上创建属性集,而不仅仅是复合文件存储和流。 独立实现不依赖于复合文件,可用于结构化存储的任何实现。 有关此接口的复合文件实现的详细信息,请参阅 IPropertyStorage-Compound 文件实现

何时使用

使用 IPropertyStorage 管理单个属性集中的属性。 其方法支持读取、写入和删除可与属性 ID 关联的属性和可选字符串名称。 其他方法支持标准提交和还原存储作。 还有一种方法可以设置与属性存储关联的时间,另一种方法允许分配 CLSID 用于将其他代码(如用户界面代码)与属性集相关联。 枚举 方法提供指向 IEnumSTATPROPSTG的独立实现的指针,用于枚举集中的属性。

版本 0 和版本 1 属性集格式

IPropertyStorage 的独立实现同时支持版本 0 和版本 1 属性集序列化格式。 有关详细信息,请参阅 属性集序列化。 属性集以版本 0 格式创建,除非请求新功能,否则仍采用该格式。 此时,格式将更新为版本 1。

例如,如果使用PROPSETFLAG_DEFAULT标志创建属性集,则其格式为版本 0。 只要符合版本 0 格式的属性类型写入该属性集并从该属性集读取,该属性集将保持版本 0 格式。 如果将版本 1 属性类型写入属性集,则属性集将自动更新为版本 1。 随后,仅了解版本 0 的实现无法再读取该属性集。

IPropertyStorage 和 Variant 类型

IPropertyStorage 的独立实现不支持VT_UNKNOWN或VT_DISPATCH vt 成员 PROPVARIANT 结构中的变体类型。

SafeArray 中支持以下变体类型;也就是说,这些值可与 PROPVARIANT 结构的 vt 成员中的VT_ARRAY结合使用。

通过 IPropertyStorage 复合文件实现在 SafeArray 中支持的变体类型

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

 

 

当VT_VARIANT与VT_ARRAY相结合时,SafeArray 本身将保留 PROPVARIANT 结构。 但是,这些元素的类型必须从前面的列表中获取,不能VT_VARIANT,并且不能包括VT_VECTOR、VT_ARRAY或VT_BYREF指示器。

IPropertyStorage 方法

IPropertyStorage 的独立实现支持以下方法:

IPropertyStorage::ReadMultiple

读取 rgpspec 数组中指定的属性,并提供 PROPVARIANT 元素的 rgvar 数组中的所有有效属性的值。

在系统提供的独立实现中,引用流或存储类型的重复属性标识符会导致多次调用 IStorage::OpenStreamIStorage::OpenStorageReadMultiple 的成功或失败取决于基础存储实现共享开放存储的能力。

此外,为了确保通过同一 IPropertyStorage 指针多次请求同一流或存储值属性时线程安全作,打开作将成功或失败,具体取决于该属性是否已打开,以及基础文件系统是否处理流或存储的多个打开。 因此,对流或存储值属性执行 ReadMultiple作始终会导致调用 IStorage::OpenStream,或 IStorage::OpenStorage,传递访问权限 STGM_READWRITE(例如),并共享值(例如STGM_SHARE_EXCLUSIVE,例如),在最初打开或创建属性集时指定。

如果方法失败,则写入到 rgvar[] 的值是未定义的。 如果成功打开某些流或存储值属性,但在执行完成之前发生错误,则应在方法返回之前释放这些属性。

IPropertyStorage::WriteMultiple

写入在 rgpspec[] 数组中指定的属性,为其分配 PROPVARIANT 标记和 rgvar[] 中指定的值。 为已经存在的属性分配了指定的 PROPVARIANT 值,并创建了当前不存在的属性。

IPropertyStorage::D eleteMultiple

删除在 rgpspec[] 中指定的属性。

IPropertyStorage::ReadPropertyNames

读取与 rgpropid[] 数组中指定的属性 ID 关联的现有字符串名称。

IPropertyStorage::WritePropertyNames

rglpwstrName 数组中指定的字符串名称分配给 rgpropid 数组中指定的属性 ID。

IPropertyStorage::D eletePropertyNames

通过将 NULL 写入属性名称,删除在 rgpropid 数组中指定的属性 ID 的字符串名称。

IPropertyStorage::SetClass

设置属性集流的 CLSID。 在独立实现中,在非简单属性集(可以包含存储或流值属性的集合)上设置 CLSID,如 IPropertySetStorage::Create中所述,还会在基础子存储上设置 CLSID,以便可以通过调用 IStorage::Stat获取它。

IPropertyStorage::Commit

对于简单和非simple 属性集,请将内存映像刷新到磁盘子系统。 此外,对于非简单事务处理模式属性集,此方法对属性集调用 IStorage::Commit

IPropertyStorage::Revert

对于非简单属性集,请调用基础存储的 Revert 方法,并重新打开“contents”流。 对于简单属性集,仅返回E_OK。

IPropertyStorage::Enum

创建一个实现 IEnumSTATPROPSTG的枚举器对象,该方法可用于枚举 STATPROPSTG 结构,这些结构提供有关集中每个属性的信息。

此实现创建一个数组,在该数组中读取整个属性集,并在调用 IEnumSTATPROPSTG::Clone 时共享该数组。

IPropertyStorage::Stat

填写 STATPROPSETSTG 结构的成员,该结构包含有关整个属性集的信息。 返回时,提供指向结构的指针。

对于非简单存储集,此实现调用 IStorage::Stat(或 IStream::Stat)从基础存储或流中获取信息。

IPropertyStorage::SetTimes

仅对于非简单属性集,设置基础存储支持的时间。 SetTimes 的此实现 调用基础存储的 IStorage::SetElementTimes 方法来修改时间。 它支持基础方法支持的时间,该方法可以是修改时间、访问时间或创建时间。

IPropertySetStorage-独立实现

IPropertyStorage

IStorage::SetElementTimes

StgOpenPropStg

StgCreatePropStg

StgCreatePropSetStg