Windows Search 作为开发平台

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

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

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

本主题的组织方式如下:

入门

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

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

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

搜索开发方案概述

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

添加新数据存储

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

添加新的文件格式

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

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

  • 在 UI 中显示非索引项属性。
  • 支持编写属性。

使用 Windows 搜索结果

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

查询数据

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

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

另一个选项是使用 search-ms:// 和 search:// 协议,这些协议执行通过 Windows 资源管理器呈现的基于 URL 的搜索。 此选项启用最轻量级开发,但不会将结果或用户选择从结果视图返回到调用应用程序。 此外,与其他协议一样,如果第三方搜索应用程序符合所需的功能集,也可以接管 search-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) 添加剪贴板格式(数据对象用于拖放和复制/粘贴方案) 数据目标处理程序 创建数据处理程序
为快捷菜单中通常显示的项目添加动词 快捷菜单处理程序 创建上下文菜单处理程序
使用动态谓词自定义快捷菜单
将文件类型与特定图标相关联 图标处理程序 创建图标处理程序
使用 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 Search 支持的语言

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

Windows Search 开发人员指南