属性系统概述

Windows 属性系统是一个可扩展的数据定义读/写系统,它提供一种统一的方式来表达有关 Shell 项的元数据。 Windows Vista 及更高版本中的 Windows 属性系统使你能够存储和检索 Shell 项的元数据。 Shell 项是任何单个内容,例如文件、文件夹、电子邮件或联系人。 属性是与 Shell 项关联的单个元数据片段。 属性值表示为 PROPVARIANT 结构。

本主题的组织方式如下:

简介

属性由规范名称 ((如 System.Document.LastAuthor) )和属性键 ((如) ) PKEY_Document_LastAuthor 唯一标识。 (PKEY) 的属性键是由 PKEY/PROPVARIANT 或 string/PROPVARIANT 组成的名称/值对的名称部分,其中字符串是 PKEY (的规范名称,如 System.Document.LastAuthor) 。 PKEY 是一个定义,它告诉属性系统它需要知道的有关属性的一切,而值是属性的实际实例。 PKEY 内部包含 formatID 和 propID。

单个属性由以下三部分组成:

  • 规范名称,例如 System.Music.Artist
  • 架构说明,以 .propdesc XML 文件格式指定,并通过 IPropertyDescription 以编程方式表示。
  • 一个 值,例如歌手的姓名。

架构说明包含有关属性的信息,例如属性名称、数据类型、约束、属性如何与视图和搜索系统交互的信息,等等。 名称和架构说明是全局定义的,对于所有项和类型都是相同的。 值特定于单个项。 也就是说, System.Music.Artist 属性始终定义为多值字符串,但可能具有不同的值 (或没有任何值,) 每个项。

属性处理程序将文件中存储的数据转换为结构化架构,该架构由 Windows 资源管理器、Windows 搜索和其他应用程序识别并可供访问。 然后,这些系统可以与属性处理程序交互,以便向文件写入和读取属性。 已翻译的数据以编程方式公开,并通过 Windows 资源管理器在各种上下文(包括详细信息视图、信息提示、详细信息窗格、属性页等)中向用户显示。 每个属性处理程序都与特定文件类型相关联,该文件类型由文件扩展名标识。 开发人员应实现生成和使用其文件类型的本机格式(如 .jpg 或 .png)的属性处理程序,或使用生成和使用 MS-PROPSTORE 二进制格式的 In-Memory 属性存储。

Windows 属性系统创建一个抽象数据模型,该模型提供单个文件格式的抽象级别。 Windows 属性系统提供的抽象数据模型是一种用于读取和写入与 Shell 项关联的可扩展命名值集的方法。 值表达式很灵活,支持多种数据类型,并且可扩展,使任意数据 (VT_BLOB) 和对象表示为值。

由于抽象,可以查询任何项的属性或元数据。 可以抽象的项目示例包括 Microsoft Office 文档、ID3 标记、AutoCAD和其他第三方专有软件。 同样,如果有 .jpeg 文件,则可以使用 .jpeg 和 EXIF 编解码器读取文件的字节,以发现图像的尺寸。 如果有.png文件,则需要不同的编解码器和不同的代码才能执行此操作。 使用 Windows 属性系统可避免此类问题。 如果实现新的文件类型,可以选择插入 Windows 属性系统提供的统一抽象,并指定如何使元数据可供使用。 出于这些原因,始终最好使用 Windows 属性系统提供的通用平台。

开发方案

属性由生成者和使用者表示。 在此上下文中,生成者是 Windows 属性系统中属性的发明者,使用者是 (的应用程序及其开发人员) 使用此系统中的属性信息。 下表标识了 Windows 属性系统中的 和 参与者的用法。

使用 Windows 属性系统 参与者
一个构建基块,它提供属性说明的可扩展注册表、内存中属性存储实现,以及用于绑定到属性处理程序、转换类型和序列化属性存储的服务。 使用者
希望以抽象方式读取和写入属性的应用程序。 使用者
属性发明者通过定义自定义属性架构和开发自己的属性处理程序来定义属性系统的新属性。 创建器
想要允许访问以自定义文件格式存储的属性的文件格式的文件格式所有者。 创建器

 

使用者使用现有属性、架构和属性处理程序。 可供使用的属性包括受支持文件类型的属性处理程序的读/写属性,还可能包含一些自定义属性。 可用架构至少包括系统架构,有时还包括其他架构。 使用者可以创建一个应用程序来使用元数据,并根据艺术家生成视图,而不考虑项存储在什么文件夹中。 文件夹层次结构无关紧要。 例如,可以指定特定歌手的所有歌曲项,而无需考虑此类项的位置。 这种复杂的端到端方案不限于 Windows 属性系统,而是涉及多个不同的组件,例如索引和搜索文件夹。

属性发明者或第三方开发人员是 Windows 属性系统中的生成者。 准备定义新属性时,首先检查 Windows 定义的属性集。 如果找到满足需求的类型和语义与所需用途相匹配的属性,请使用该属性,不要发明新的属性。 如果要定义新的自定义属性,请尝试与其他可能想要使用该属性的开发人员达成协议,并发布该协议的结果,以便他们可以加入该属性的用户社区。

生成者可以利用 Windows 资源管理器功能。 例如,如果要编写新的图像格式并实现属性处理程序,则新的文件格式将在 Windows 资源管理器中可用。 然后,用户可以根据 Windows 属性系统中的任何属性标记其照片并透视其照片集合。 事实上,Shell 对属性执行的任何操作,第三方开发人员都可以在自己的应用程序中执行。 这包括分组、排序、查询和显示完整属性。 Windows 资源管理器提供的用户体验主要由第三方通过公开提供的 API 实现。 可以使用这些 API 替换或扩展 Windows 资源管理器。

从使用 Shell 数据模型的应用程序的角度来看,有各种各样的方案涉及使用 Windows 属性系统。 媒体管理应用程序就是一个突出的示例。 核心属性系统方案包括读取照片的关键字 (keyword) 属性或设置 datetaken 属性等方案。 Windows 属性系统启用但需要多个其他组件才能正常运行的端到端集成方案的示例,包括显示所有图片或查找包含关键字 (keyword) 的文档。

当生成者和使用者与 Windows 搜索和索引交互时,属性为它们提供服务。 Windows 搜索具有属性值的缓存,这些值用于实现 Windows Search Service (WSS) 。 可以使用 Windows 搜索 OLE DB 提供程序或通过 ISearchFolderItemFactory 以编程方式查询这些属性值,后者表示搜索结果和基于查询的视图中的项。 然后,Windows Search 会收集并存储筛选器处理程序或属性处理程序在为项(如Word文档)编制索引时发出的属性。 重新生成索引时,此存储将被丢弃并重新生成。

注意

请记住,重新注册架构时,索引器可能不会遵循对以前定义属性的属性所做的更改。 解决方案是重新生成索引,或引入反映更改的新属性,而不是更新旧属性, (不建议) 。 有关详细信息,请参阅本主题后面的 实现者说明

 

例如,创建媒体应用程序的开发人员希望向应用程序的用户显示特定艺术家提供的所有音乐。 应用程序将向用户提供可用艺术家的列表,然后生成由用户选择的艺术家的所有可用音乐的列表。 或者,最终用户可能想要对“艺术家:贝多芬”执行查询,并在搜索过程中公开到可用属性的完整列表。 此示例涉及使用 Shell 命名空间、属性处理程序和/或通过以下方法之一查询索引:

  • Shell 数据源。
  • OLE DB 提供程序。
  • 保存的搜索文件 (.search-ms) ,用于通过导航到 Windows 资源管理器中的搜索文件或以编程方式绑定到 IShellFolder 来启动查询。

注意

尽管 属性 System.Kind 不参与此媒体应用程序方案,但它可用于生成一个查询,该查询将返回特定范围内的所有 .search-ms 文件。

 

访问搜索 API 和创建 Windows 搜索应用程序的首选方法是使用 Shell 数据源。 ISearchFolderItemFactory 是一个组件,可以创建 Search 文件夹数据源的实例,这是 Shell 提供的一种“虚拟”数据源,它可以对 Shell 命名空间中的其他数据源执行查询并枚举结果。 它可以通过使用索引器或手动枚举和检查指定作用域中的项来执行此操作。

第三方开发人员可以通过编程查询创建使用索引中的数据的应用程序,并且可以扩展索引中的数据,以便由 Windows 搜索为自定义文件和项类型编制索引。 如果要在 Windows 资源管理器中显示查询结果,必须先实现 Shell 数据源,然后才能创建协议处理程序来扩展索引。 但是,如果所有查询都将通过 OLE DB(例如) )以编程方式 (,并且由应用程序代码而不是 Shell 解释,则 Shell 命名空间仍然是首选的,但不是必需的。 Windows 需要协议处理程序才能获取有关文件内容的信息,例如数据库中的项或自定义文件类型。 虽然 Windows 搜索可以为文件的名称和属性编制索引,但 Windows 没有有关文件内容的信息。 因此,此类项无法在 Windows Shell 中编制索引或公开。 通过实现自定义协议处理程序,可以公开这些项。 有关你尝试实现的开发人员方案标识的处理程序列表,请参阅 Windows 搜索中的“处理程序概述” 作为开发平台

注意

Shell 数据源有时称为 Shell 命名空间扩展。 处理程序有时称为 Shell 扩展或 Shell 扩展处理程序。

 

对实现者的说明

由于索引器在使用属性系统的架构时可能遇到潜在困难,因此在架构的第一个版本时,必须谨慎且有策略地定义属性。 注册架构后,对属性 (类型、列宽、可索引) 的任何更改都不会反映在数据库中。 在系统上注册一次架构后,要识别这些更改的唯一方法是重新生成索引,然后注册新架构,或者注册架构,然后为每个后续版本创建新属性;例如 PKEY_GroupName_PropertyNameV2PKEY_GroupName_PropertyNameV3等。 不建议以这种方式创建新属性,因为多个无关列可能会影响系统性能。

Windows 属性系统文档

本文档的其余部分包含以下部分:

其他资源

Windows 属性系统开发人员指南

属性系统参考

属性系统代码示例