存储属性集
应用程序可以公开其文档的某些状态数据,以便其他应用程序可以查找和读取该数据。 一些示例是描述使用字处理器创建的文档的作者、标题和关键字的属性集,或文档中使用的字体列表。 此功能不限于文档;它还可用于嵌入对象。 通常,应通过 IPropertySetStorage 和 IPropertyStorage 接口访问属性集,但本部分介绍之前推荐的方法。
注意
如果存储应用程序内部的属性集,则可能不希望使用以下准则。 若要向其他应用程序公开属性集,请遵循以下准则。
将属性集存储在复合文件中
- 在与其数据流相同的存储结构级别中创建 IStorage 或 IStream 实例。 在 IStorage 或 IStream 实例的名称后面加上“\005”。以 0x05 开头的流和存储名称是为可在应用程序之间共享的通用属性集保留的。 此外,以该值开头的流限制为 256 KB。 可以从已发布的名称和格式中选择名称,也可以通过分配属性集 FMTID 并根据 存储对象命名约定中所述的约定从 FMTID 派生名称。
- 属性集可以存储在单个 IStream 实例中,也可以存储在包含多个流和存储的 IStorage 实例中。 对于 IStorage 实例,名为 Contents 的包含流是包含属性值的主流,其中某些值可能是此属性集存储中其他流或存储实例的名称。
- 指定对象类的 CLSID,该对象类可以显示或提供对属性值的编程访问。 如果没有此类,则应将 CLSID 设置为属性集的格式标识符。 对于使用 IStorage 实例的属性集,请将 IStorage 实例的 CLSID 设置为与内容流中存储的 CLSID 相同,或者 CLSID_NULL;新创建的 IStorage 实例中的 值。
- 可以选择指定构成字典内容的可显示名称。
某些应用程序只能读取存储为 IStream 实例的属性集的实现。 应编写应用程序以预期属性集可能存储在 IStorage 或 IStream 实例中,除非属性集定义另有指示。 例如,“摘要信息”属性集定义指出,它只能存储在命名的 IStream 实例中。 如果正在搜索属性集,但不知道属性集是存储还是流,请首先查找具有属性集名称的 IStream 实例。 如果失败,请查找 IStorage 实例。
为了更好地了解在 IStorage 实现中存储属性集,假设有一类应用程序用于编辑有关动物的信息。 首先,CLSID (CLSID_AnimalApp) 是针对这组应用程序定义的,因此它们可以指示它们了解包含动物信息的属性集 (FMTID_AnimalInfo) ,以及包含 (FMTID_MedicalInfo) 的医疗信息的其他属性集。
IStorage (File): "C:\OLE\REVO.DOC"
IStorage: "\005AnimalInfo", CLSID = CLSID_AnimalApp
IStream: "Contents"
WORD wByteOrder, WORD wFmtVersion, DWORD dwOSVer,
CLSID CLSID_AnimalApp, DWORD cSections...
...
FMTID = FMTID_AnimalInfo
Property: Type = PID_ANIMALTYPE, Type = VT_LPWSTR,
Value = L"Dog"
Property: Type = PID_ANIMALNAME, Type = VT_LPWSTR,
Value = L"Revo"
Property: Type = PID_MEDICALHISTORY, Type = VT_STREAMED_OBJECT,
Value = "MedicalInfo"
...
IStream: "MedicalInfo"
WORD wByteOrder, WORD wFmtVersion, DWORD dwOSVer,
CLSID CLSID_AnimalApp, DWORD cSections...
...
FMTID = CLSID_MedicalInfo
Property: Type = PID_VETNAME, Type = VT_LPWSTR,
Value = L"Dr. Woof"
Property: Type = PID_LASTEXAM, Type = VT_DATE, Value = ...
请注意,IStorage 接口和两个属性集的 CLSID CLSID_AnimalApp。 这标识可以显示和/或提供对这些属性集的编程访问的任何应用程序。 任何应用程序都可以读取属性集中的数据 (属性集) 后面的点,但只有使用 CLSID_AnimalApp 的类标识符标识的应用程序才能理解属性集中数据的含义。