添加图标、预览和快捷菜单
若要确保在搜索过程中为数据编制索引并正确呈现给用户,需要实现 Shell 数据存储 (也称为 Shell 命名空间扩展) , (也称为 Shell 扩展、 扩展处理程序或 Shell 扩展处理程序) 文件类型处理程序。
本主题介绍以下接口:
实现文件类型处理程序
这些 Shell 扩展或文件类型处理程序为用户提供以下 Shell 体验:
- 结果视图显示项类型的特定图标。
- 当用户选择该项时,结果视图将显示该项的预览。
- 用户可以双击项以启动事件,例如打开文件。
- 用户可以右键单击项以访问快捷方式 (上下文) 菜单。
- 用户可以拖放项。
与所有组件对象模型 (COM) 对象一样,文件类型处理程序必须实现 IUnknown 接口和类工厂。
在 Windows XP 或更早版本中,处理程序还应实现:
在 Windows Vista 中, IPersistFile 接口 和 IShellExtInit 接口 替换为以下三个接口,以便 Shell 初始化处理程序:
若要提供合理的用户体验,必须使用协议处理程序提供 Shell 数据存储。 然后,该数据存储充当图标处理程序、快捷菜单处理程序、预览处理程序等的“工厂”。 IShellFolder 接口需要 IPersist 接口和 IPersistFolder 接口的最小实现,IContextMenu 和 IExtractIcon 需要 IShellFolder 接口的最小实现。
注意
应为 IPersist、 IPersistFolder 和 IShellFolder 实现相同的类标识符 (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 方法公开。 此方法使外接程序能够查询 IExtractIcon 和 IContextMenu 接口。
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 界面定义的快捷菜单。 快捷菜单也称为上下文菜单。
上下文菜单上的默认操作与双击该项时执行的操作相同。 如果没有项的相应 IShellFolder 或 IContextMenu 接口,双击事件的默认行为是将 URL 作为参数传递给 ShellExecute 函数 。
有关 创建快捷菜单处理程序 的详细信息,请参阅创建上下文菜单处理程序,以及 示例代码的示例:协议处理程序的 Shell 扩展 。
IExtractIcon
IExtractIcon 根据协议处理程序提供的 PIDL 中的 URL 检索 Windows 搜索用户界面的图标。
有关 创建图标处理程序 的详细信息,请参阅创建图标处理程序,以及 示例代码的示例:协议处理程序的 Shell 扩展 。
IPreviewHandler
IPreviewHandler 在 Windows 资源管理器中呈现所选项的丰富预览。 预览版在 Windows Search 4.0 中可用,或在 Windows Vista 中使用 Windows 桌面搜索 3.x 提供。
创建自定义预览处理程序:
按照预览处理程序中提供的准则,实现采用 IStream 的 IPreviewHandler。
注册预览处理程序:
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>}
完成以下两个步骤,为 URL 实现 Shell 文件夹:
在 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);
在 Shell 查询 Shell 文件夹中的数据流以初始化预览处理程序后,转到 IShellFolder::BindToObject 方法 ,处理IID_IStream并将 IStream 返回到 URL。
若要为文件类型重复使用现有的预览处理程序,请执行以下两个步骤:
- 使用现有预览处理程序的 CLSID 代替 <Your_PreviewHandler_GUID>,为文件类型注册该预览处理程序。
- 实现 Shell 文件夹。
有关创建预览处理程序的详细信息,请参阅 IPreviewHandler 和 预览处理程序。
其他资源
- 有关索引过程的概述,请参阅 索引编制过程。
- 有关创建处理程序的信息,请参阅 注册 Shell 扩展、 创建 Shell 扩展处理程序、 上下文菜单、 Shell 命名空间扩展 和 预览处理程序。
相关主题