添加图标、预览和快捷菜单

若要确保在搜索过程中为数据编制索引并正确呈现给用户,需要实现 Shell 数据存储 (也称为 Shell 命名空间扩展) , (也称为 Shell 扩展、 扩展处理程序或 Shell 扩展处理程序) 文件类型处理程序。

本主题介绍以下接口:

实现文件类型处理程序

这些 Shell 扩展或文件类型处理程序为用户提供以下 Shell 体验:

  • 结果视图显示项类型的特定图标。
  • 当用户选择该项时,结果视图将显示该项的预览。
  • 用户可以双击项以启动事件,例如打开文件。
  • 用户可以右键单击项以访问快捷方式 (上下文) 菜单。
  • 用户可以拖放项。

与所有组件对象模型 (COM) 对象一样,文件类型处理程序必须实现 IUnknown 接口和类工厂。

在 Windows XP 或更早版本中,处理程序还应实现:

在 Windows Vista 中, IPersistFile 接口IShellExtInit 接口 替换为以下三个接口,以便 Shell 初始化处理程序:

若要提供合理的用户体验,必须使用协议处理程序提供 Shell 数据存储。 然后,该数据存储充当图标处理程序、快捷菜单处理程序、预览处理程序等的“工厂”。 IShellFolder 接口需要 IPersist 接口IPersistFolder 接口最小实现,IContextMenuIExtractIcon 需要 IShellFolder 接口的最小实现。

注意

应为 IPersistIPersistFolderIShellFolder 实现相同的类标识符 (CLSID) 。

 

有关创建 Shell 数据存储以支持协议处理程序的详细信息,请参阅 实现基本文件夹对象接口

IPersist

IPersist 接口定义单个方法 GetClassID,该方法旨在提供可永久存储在系统中的对象的 CLSID。

方法 说明
GetClassID 返回 Shell 数据存储对象的 CLSID

 

IPersistFolder

IPersistFolder 接口用于初始化 Shell 文件夹对象。 此接口的实现(派生自 IPersist)是告知文件夹在 Shell 命名空间中的位置的方式。 不直接使用此接口。 初始化 Shell 文件夹对象时, 由 IShellFolder::BindToObject 方法 的文件系统实现使用。

方法 说明
Initialize 指示 Shell 文件夹对象根据传递的信息初始化自身,并返回S_OK

 

IShellFolder

IShellFolder 接口用于管理文件夹,并且需要部分实现,以便为协议处理程序实现的图标和上下文接口在 Windows 搜索结果用户界面中正常运行。 所需的大部分功能都通过 GetUIObjectOf 方法公开。 此方法使外接程序能够查询 IExtractIconIContextMenu 接口。

IShellFolder 接口使用 PIDL 而不是 URL。 与完整 Shell 数据存储的要求不同,加载项可以使用仅包含 URL 的简单 IDL 结构。

必须实现 IShellFolder 接口 的以下方法。 其中五种方法需要最少的实现。

方法 说明
BindToObject 返回E_NOTIMPL
BindToStorage 返回E_NOTIMPL
CreateViewObject 返回E_NOTIMPL
SetNameOf 返回E_NOTIMPL
ParseDisplayName 将 URL 转换为 PIDL 结构
CompareIDs 比较两个 PIDL 值
GetDisplayNameOf 返回 PIDL 的 URL
GetUIObjectOf 此方法类似于 IUnknown::QueryInterface 方法。 如果请求图标,则调用方请求IID_IExtractIcon;如果请求快捷菜单,则调用方请求IID_IContextMenu

 

IShellFolder 不用于枚举文件夹。 这意味着文件夹的显示名称将是物理 URL。 在将来,这可能会有变化。

IContextMenu

当 Windows 搜索向用户显示结果时,用户可以右键单击某个项并查看 由 IContextMenu 界面定义的快捷菜单。 快捷菜单也称为上下文菜单。

上下文菜单上的默认操作与双击该项时执行的操作相同。 如果没有项的相应 IShellFolderIContextMenu 接口,双击事件的默认行为是将 URL 作为参数传递给 ShellExecute 函数

有关 创建快捷菜单处理程序 的详细信息,请参阅创建上下文菜单处理程序,以及 示例代码的示例:协议处理程序的 Shell 扩展

IExtractIcon

IExtractIcon 根据协议处理程序提供的 PIDL 中的 URL 检索 Windows 搜索用户界面的图标。

有关 创建图标处理程序 的详细信息,请参阅创建图标处理程序,以及 示例代码的示例:协议处理程序的 Shell 扩展

IPreviewHandler

IPreviewHandler 在 Windows 资源管理器中呈现所选项的丰富预览。 预览版在 Windows Search 4.0 中可用,或在 Windows Vista 中使用 Windows 桌面搜索 3.x 提供。

创建自定义预览处理程序:

  1. 按照预览处理程序中提供的准则,实现采用 IStreamIPreviewHandler

  2. 注册预览处理程序:

    HKEY_CLASSES_ROOT\<Your_Object_Type>
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}
       @ = {<Your_PreviewHandler_GUID>}
    
  3. 完成以下两个步骤,为 URL 实现 Shell 文件夹:

    1. IShellFolder::GetUIObjectOf 方法中,处理 IQueryAssociations 并返回 Shell 项的关联,如以下代码示例所示。

      CComPtr<IQueryAssociations> spqa;
      AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa);
      spqa->Init(0, L"Your_Object_Type", NULL, NULL);
      spqa->QueryInterface(riid, ppvReturn);
      
    2. 在 Shell 查询 Shell 文件夹中的数据流以初始化预览处理程序后,转到 IShellFolder::BindToObject 方法 ,处理IID_IStream并将 IStream 返回到 URL。

若要为文件类型重复使用现有的预览处理程序,请执行以下两个步骤:

  1. 使用现有预览处理程序的 CLSID 代替 <Your_PreviewHandler_GUID>,为文件类型注册该预览处理程序。
  2. 实现 Shell 文件夹。

有关创建预览处理程序的详细信息,请参阅 IPreviewHandler预览处理程序

其他资源

概念性

开发协议处理程序

了解协议处理程序

通知索引更改

代码示例:协议处理程序的 Shell 扩展

安装和注册协议处理程序

为协议处理程序创建搜索连接器

调试协议处理程序