Windows Search 作为开发平台

若要为新文件格式和数据存储的内容和属性编制索引,必须使用加载项扩展 Microsoft Windows 搜索。

在新的文件格式和数据存储的第三方开发人员可以获取这些格式和存储显示在 Windows 资源管理器中的查询结果之前,开发人员必须执行以下三项操作:

  • 实现 Shell 数据源以扩展 Shell 命名空间。
  • 如果数据存储区中的项要添加新数据存储,则公开 (,因为需要) 索引项。
  • 开发协议处理程序,以便 Windows 搜索可以访问数据进行索引。

本主题的组织方式如下:

入门

在开始创建 Windows 搜索应用程序之前,请记住,执行此操作的首选方法是使用 Shell 数据源。 Shell 数据源扩展 Shell 命名空间,并公开数据存储中的项。 然后,Windows 搜索系统可以使用协议处理程序为数据存储中的项编制索引。 这种通过实现 Shell 数据源访问 Windows 搜索的间接方法是首选方法,因为它提供对完整 Shell 功能的访问权限。 这样做可确保合理的用户体验。

如果希望查询结果显示在 Windows 资源管理器中,必须先实现 Shell 数据源,然后才能创建协议处理程序来扩展索引。 但是,如果所有查询都将通过 OLE DB 以编程方式 (,例如) 并由应用程序代码而不是 Shell 解释,则 Shell 命名空间仍然是首选的,但不是必需的。

Windows 需要协议处理程序才能获取文件内容的知识,例如数据库中的项或自定义文件类型。 虽然 Windows 搜索可以索引文件的名称和属性,但 Windows 不知道文件的内容。 因此,此类项无法在 Windows Shell 中编制索引或公开。 通过实现自定义协议处理程序,可以公开这些项。 有关你尝试实现的开发人员方案标识的处理程序的列表,请参阅 处理程序概述

搜索开发方案概述

Windows 搜索中最常见的开发方案包括:

添加新数据存储

仅当要添加要编制索引的新数据存储时,才需要 Windows Search 的 Shell 数据存储。 数据存储是一个数据存储库,可以使用 Shell 数据源作为容器向 Shell 编程模型公开。 然后,Windows 搜索系统可以使用协议处理程序为数据存储中的项编制索引。 协议处理程序实现用于以本机格式访问内容源的协议。 ISearchProtocolISearchProtocol2 接口用于实现自定义协议处理程序,以扩展可编制索引的数据源。 有关创建 Shell 数据源的信息,请参阅 实现基本文件夹对象接口

添加新文件格式

如果添加新的自定义文件格式,则需要开发筛选器处理程序或属性处理程序,但不能同时开发两者。 筛选器是 IFilter 接口的实现。 它打开特定文件类型的文件,并筛选索引器的属性和文本块。 筛选器与文件类型相关联,如文件扩展名、MIME 类型或 CLSID) (类标识符所表示的那样。 尽管一个筛选器可以处理多个文件类型,但每种文件类型只能处理一个筛选器。

属性处理程序将文件中存储的数据转换为结构化架构,该架构由 Windows 资源管理器、Windows 搜索和其他应用程序识别并可供访问。 然后,这些系统可以与属性处理程序交互,以便向文件写入和读取属性。 已翻译的数据包括详细信息视图、信息提示、详细信息窗格、属性页等。 每个属性处理程序都与由文件扩展名标识的特定文件类型相关联。 需要属性处理程序来执行以下操作:

  • 在 UI 中显示未编制索引的项属性。
  • 支持写入属性。

使用 Windows 搜索结果

以下部分介绍使用 Windows 搜索结果的几种方法:

查询数据

基于组合的 Windows 搜索和 Windows 属性系统编写应用程序的开发人员可以访问文件和项,而不考虑应用程序或文件类型。 应用程序可通过两种方式访问索引器数据:

  • 应用程序通过将 Windows Search 结构化查询语言 (SQL) 查询发送到 Windows Search OLE DB 访问接口来检索结果,直接与 OLE DB 通信。 可以手动构造查询,也可以使用 ISearchQueryHelper 接口从搜索关键字生成 SQL,并使用高级查询语法 (AQS) 。
  • 应用程序通过 Shell 层工作。 Shell 层的优点是它还支持 grep 等其他源。 但是,缺点是并非所有索引器功能都可用。

另一个选项是使用搜索 ms:// 和 search:// 协议,这些协议执行通过 Windows 资源管理器呈现的基于 URL 的搜索。 此选项支持最轻量级开发,但不会将结果或用户选择从结果视图返回给调用应用程序。 此外,与其他协议一样,如果应用程序符合所需的功能集,第三方搜索应用程序可以接管搜索 ms:// 和 search:// 协议。 有关查询的详细信息,请参阅 在 Windows 搜索中查询进程以编程方式查询索引

在 Windows 7 及更高版本中,联合搜索提供了一个新的搜索提供程序,该提供程序通过 Web 服务器、 OpenSearch 协议查询远程数据存储,并将结果枚举为 RSS 或 Atom XML 源。 搜索连接器是命名空间交接点,使用搜索提供程序模拟文件夹行为。 有关 Windows 7 中远程数据存储的搜索联合的详细信息,请参阅 Windows 中的联合搜索

为文件和项编制索引

索引的内容基于通过 Windows 搜索附带的加载项支持的文件和数据类型,以及文件系统中文件夹的默认包含和排除规则。 例如,窗口搜索中包含的筛选器支持 200 多种常见类型的数据,包括 Microsoft Office 文档、Microsoft Outlook 电子邮件 (与 MAPI 协议处理程序) 、纯文本文件、HTML 等。 有关本机支持的文件类型的完整列表,请参阅 索引中包含的内容

可以使用属性处理程序和筛选器扩展索引,以便向索引和 Windows 资源管理器公开新文件格式的内容和属性。 筛选器是 IFilter 接口的实现。 有两种类型的筛选器:一种与单个项(如文件)交互,另一种与容器(如文件夹)交互。 筛选器具有多种用途,因为它们支持分块数据、文本内容、某些属性和多种语言。

相比之下,属性处理程序有一个更具体的用途:公开由文件扩展名标识的特定文件类型的属性。 文件类型的属性处理程序可以启用获取和设置属性,并且可以枚举与该文件类型关联的属性。 与筛选器不同,属性处理程序不支持清查数据或文本内容,并且属性处理程序无法指示文本属性的语言,除非它们支持编写属性。

为数据存储编制索引

可以使用协议处理程序扩展索引,以提供对专有数据存储的访问权限。 例如,非文件系统数据存储 ((如数据库和电子邮件存储)中包含的文件和项) 需要协议处理程序从 URL 映射到流。 协议处理程序还可以选择确定用于从流中提取信息的正确筛选器。 筛选器枚举数据存储 URL。 然后,使用适当的筛选器和/或属性处理程序单独为项编制索引。 有关详细信息,请参阅 扩展索引

管理索引过程

应用程序开发人员可以使用各种管理接口控制 Windows 搜索索引的范围和频率。 这些接口包括添加和删除索引器扫描更改的目录、手动通知索引数据更改、检查索引器的状态以及强制重新编制部分或所有数据的索引的功能。 有关详细信息,请参阅 管理索引

将 Windows 属性系统与 Windows 搜索应用程序集成

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

许多常见项目类型(如照片、音乐、文档、消息、联系人和文件)包含广泛的常见属性列表。 如果没有现有属性满足其需求,开发人员还可以将自己的属性引入平台。 有关将应用程序与 Windows 属性系统集成的详细信息,请参阅 开发属性处理程序

处理程序概述

处理程序是组件对象模型 (COM) 对象,它为 Shell 项提供功能。 大多数 Shell 数据源都提供一个可扩展的系统,用于将处理程序绑定到项。 例如,文件系统文件夹使用关联系统来查找特定文件类型的处理程序。 每种文件类型都需要特定的处理程序。 Adobe Acrobat .pdf文件类型需要一个筛选器处理程序,例如,.doc文件格式需要另一个筛选器处理程序,依此类推。

不同的处理程序具有一些共性。 在 Windows Vista 及更高版本中,所有处理程序都必须使用以下接口之一来初始化处理程序: IInitializeWithStreamIInitializeWithItemIItinitializeWithFile

下表列出了高级开发人员任务、每个任务所需的处理程序类型,并提供有关如何执行每个任务的概念信息的链接。

任务 Handler 概念性信息
访问用于编制索引的文件的属性 属性处理程序 开发属性处理程序
自定义文件格式的系统定义属性
为数据对象添加剪贴板格式 (IDataObject) 项 (在拖放和复制/粘贴方案中使用 Data 对象。) 数据目标处理程序 创建数据处理程序
为快捷菜单中通常显示的项添加谓词 快捷菜单处理程序 创建上下文菜单处理程序
使用动态谓词自定义快捷菜单
将文件类型与特定图标相关联 图标处理程序 创建图标处理程序
使用允许与文件类型进行自定义交互的 UI 图片和控件创建属性表 属性表处理程序 属性表处理程序
启用项类型以支持拖放和复制/粘贴方案 删除处理程序 使用拖放和剪贴板传输 Shell 对象
提取文本区块和文档属性以编制索引 筛选器处理程序 开发筛选器处理程序
为新文件类型编制索引 筛选器处理程序、属性处理程序 开发筛选器处理程序
开发属性处理程序
为数据存储的内容编制索引 协议处理程序 开发协议处理程序
在 Windows 资源管理器预览窗格中预览 Shell 项的简化视图 预览处理程序 预览处理程序
当鼠标悬停在 UI 对象上时提供弹出文本 Infotip 处理程序 创建 shell 扩展处理程序 (信息提示自定义)
提供静态图像来表示 Shell 项 缩略图处理程序 缩略图处理程序

 

下表列出了用于实现每种类型的处理程序的处理程序和接口。

Handler 接口
删除处理程序 IDropTargetIDropTargetHelperIPersistFileIShellExtInit
数据目标处理程序 IDataObjectIPersistFile
筛选器处理程序 IFilter
图标处理程序 IExtractIcon
可选: IPersistIPersistFile
Infotip 处理程序 IQueryInfo
预览处理程序 IPreviewHandler
属性处理程序 IPropertyStore
协议处理程序 IFilterISearchProtocolIUrlAccessor
可选: ISearchProtocol2IUrlAccessor2IUrlAccessor3IUrlAccessor4
属性表处理程序 IShellExtInitIShellPropSheetExt
快捷菜单处理程序 IContextMenuIExplorerCommandIShellExtInit
缩略图处理程序 IThumbnailProvider

 

注意

属性处理程序有时被指定为元数据处理程序。 Shell 数据源有时称为 Shell 命名空间扩展。 文件类型处理程序有时称为 Shell 扩展处理程序或 Shell 扩展名。

 

有关创建处理程序的详细信息,请参阅 创建 Shell 扩展处理程序。 有关属性的详细信息,请参阅 Windows 属性系统

加载项安装程序指南

创建外接程序安装程序时,请遵循以下准则:

  • 安装程序必须使用 EXE 或 MSI 安装程序。
  • 必须提供发行说明。
  • 必须为每个已安装的外接程序创建 “添加/删除程序” 条目。
  • 安装程序必须接管当前外接程序所理解的特定文件类型或存储的所有注册表设置。
  • 如果以前的加载项被覆盖,安装程序应通知用户。
  • 如果较新的外接程序覆盖了以前的加载项,用户应能够还原上一个外接程序的功能,并再次使其成为该文件类型或存储区的默认外接程序。

对实现者的说明

在创建筛选器或属性处理程序之前,开发人员应考虑以下事项:

  • 这些处理程序是加载到你无法控制的进程中的进程内扩展,例如筛选器守护程序进程、Windows 资源管理器 (grep 搜索) ,以及 Windows 邮件) 等第三方主机。
  • 必须编写足够可靠的安全代码,以便处理为攻击系统而创建的文件格式的任意损坏形式。
  • 外接程序不得泄漏会导致主机进程出现问题的资源。
  • 加载项不得崩溃,因为这样也会破坏主机进程并减慢筛选过程。
  • 由于这些处理程序在后台系统进程中运行,因此它们必须以最少的 CPU 和 I/O 来快速执行,以满足系统的性能要求。

因此,这些加载项应由具有创建系统级代码专业知识的开发人员编写。

其他资源

Windows 搜索概述

Windows 搜索支持的语言

将托管代码与 Shell 数据和 Windows 搜索一起使用

Windows 搜索开发人员指南