IPropertyStorage-独立实现
系统提供的 IPropertySetStorage 独立实现包括 IPropertyStorage 的实现,该接口在属性集存储中读取和写入属性。 IPropertySetStorage 接口在存储中创建并打开属性集。 独立实现中还提供了 IEnumSTATPROPSTG 和 IEnumSTATPROPSETSTG 接口。
若要获取指向 IPropertyStorage 独立实现的指针,请调用 StgCreatePropStg 函数创建新的属性集,或调用 StgOpenPropStg 以获取现有属性集 (的接口指针,或调用 IPropertySetStorage 独立实现) 的 Create 或 Open 方法。
IPropertyStorage 的独立实现针对任何存储或流对象(而不仅仅是复合文件存储和流)创建属性集。 独立实现不依赖于复合文件,可以与结构化存储的任何实现一起使用。 有关此接口的复合文件实现的详细信息,请参阅 IPropertyStorage-Compound File Implementation。
何时使用
使用 IPropertyStorage 管理单个属性集中的属性。 其方法支持读取、写入和删除属性以及可与属性 ID 关联的可选字符串名称。 其他方法支持标准提交和还原存储操作。 还有一个方法用于设置与属性存储关联的时间,另一种方法允许分配 CLSID 用于将其他代码(如用户界面代码)与属性集相关联。 Enum 方法提供指向 IEnumSTATPROPSTG 的独立实现的指针,该实现枚举集中的属性。
版本 0 和版本 1 属性集格式
IPropertyStorage 的独立实现支持版本 0 和版本 1 属性集序列化格式。 有关详细信息,请参阅 属性集序列化。 属性集以版本 0 格式创建,除非请求新功能,否则将保留该格式。 此时,格式将更新为版本 1。
例如,如果使用 PROPSETFLAG_DEFAULT 标志创建属性集,则其格式为版本 0。 只要将符合版本 0 格式的属性类型写入该属性集并从中读取,该属性集将保持为版本 0 格式。 如果将版本 1 属性类型写入属性集,则属性集会自动更新为版本 1。 随后,仅了解版本 0 的实现无法再读取该属性集。
IPropertyStorage 和 Variant 类型
IPropertyStorage 的独立实现不支持 PROPVARIANT 结构的 vt 成员中VT_UNKNOWN或VT_DISPATCH的变体类型。
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 的独立实现支持以下方法:
-
读取 rgpspec 数组中指定的属性,并提供 PROPVARIANT 元素的 rgvar 数组中所有有效属性的值。
在系统提供的独立实现中,引用流或存储类型的重复属性标识符会导致多次调用 IStorage::OpenStream 或 IStorage::OpenStorage , ReadMultiple 的成功与否取决于基础存储实现共享开放存储的能力。
此外,为了确保通过同一 IPropertyStorage 指针多次请求相同的流或存储值属性时线程安全操作,打开将成功或失败,具体取决于属性是否已打开,以及基础文件系统是否处理流或存储的多个打开。 因此,对流或存储值属性执行的 ReadMultiple 操作始终会导致调用 IStorage::OpenStream 或 IStorage::OpenStorage,从而传递访问 (STGM_READWRITE,例如,) 和共享值 (STGM_SHARE_EXCLUSIVE,例如,) 最初打开或创建属性集时指定的。
如果方法失败,则写入 rgvar[] 的值未定义。 如果某些流值或存储值属性已成功打开,但在执行完成之前发生错误,则应在方法返回之前释放这些属性。
-
写入 rgpspec[] 数组中指定的属性,并为其分配 rgvar[] 中指定的 PROPVARIANT 标记和值。 为已存在的属性分配指定的 PROPVARIANT 值,并创建当前不存在的属性。
-
删除 rgpspec[] 中指定的属性。
-
读取与 rgpropid[] 数组中指定的属性 ID 关联的现有字符串名称。
-
将 rglpwstrName 数组中指定的字符串名称分配给 rgpropid 数组中指定的属性 ID。
-
通过将 NULL 写入属性名称,删除在 rgpropid 数组中指定的属性 ID 的字符串名称。
-
设置属性集流的 CLSID 。 在独立实现中,在非简单属性集上设置 CLSID (可包含存储或流值属性集,如 IPropertySetStorage::Create) 还会设置基础子存储上的 CLSID,以便可以通过调用 IStorage::Stat 获取它。
-
对于简单和非简单属性集,将内存映像刷新到磁盘子系统。 此外,对于非简单事务处理模式属性集,此方法对属性集调用 IStorage::Commit 。
-
仅对于非简单属性集,调用基础存储的 Revert 方法并重新打开“contents”流。 对于简单属性集, 仅返回 E_OK。
-
创建一个实现 IEnumSTATPROPSTG 的枚举器对象,可调用其方法来枚举 STATPROPSTG 结构,这些结构提供有关集中每个属性的信息。
此实现将创建一个数组,该数组将读取整个属性集,并在调用 IEnumSTATPROPSTG::Clone 时可以共享该数组。
-
填充 STATPROPSETSTG 结构的成员,该结构包含有关整个属性集的信息。 返回时,提供指向 结构的指针。
对于非简单存储集,此实现调用 IStorage::Stat (或 IStream::Stat) 从基础存储或流中获取信息。
-
仅对于非简单属性集,设置基础存储支持的时间。 SetTimes 的此实现调用基础存储的 IStorage::SetElementTimes 方法来修改时间。 它支持基础方法支持的时间,可以是修改时间、访问时间或创建时间。
相关主题