创建列处理程序

[此功能仅在 Windows XP 或更早版本中受支持。 ]

Windows 资源管理器中的“详细信息”视图通常显示多个标准列。 每列列出当前文件夹中每个文件的信息,如文件大小或类型。 通过实现和注册列处理程序,可以使自定义列可供显示。

创建 Shell 扩展处理程序中讨论了实现和注册 Shell 扩展处理程序的一般过程。 本文档重点介绍特定于列处理程序的实现的那些方面。

将讨论以下主题。

列处理程序的工作原理

下图显示了“详细信息”视图中的 Windows 资源管理器。

详细信息视图中 Windows 资源管理器的屏幕截图

在 Windows 2000 中,文件夹还可以支持默认情况下不显示的大量列。 用户可以通过右键单击其中一个列标题并从菜单中选择“ 更多...” 命令来显示其他列。 然后,将显示一个对话框,其中列出了文件夹的可用列,并允许用户选择要显示的列。 下图显示了上述示例的此对话框。

Windows 资源管理器的屏幕截图,其中显示了“选择详细信息”对话框

通过创建列处理程序,可以创建自定义列并将其添加到该列表中。 例如,包含音乐的文件集合可以使用列处理程序来显示列出艺术家和每个文件包含的片段的列。

列处理程序是每次 Windows 资源管理器显示“详细信息”视图时都会调用的全局对象。 但是,列处理程序通常用于仅显示特定 文件类型的成员的自定义列。 在显示“详细信息”视图之前,Windows 资源管理器会查询所有已注册的列处理程序的列特征。 如果用户选择了处理程序的列之一,Windows 资源管理器将查询处理程序以获取关联的数据。 当列处理程序收到数据请求时,如果文件是其支持类型的成员,则它会提供它。 否则,它会通过返回S_FALSE来忽略请求。

注册列处理程序

列处理程序在以下子项下注册。

HKEY_CLASSES_ROOT
   Folder
      shellex
         ColumnHandlers

使用处理程序的类标识符的字符串形式创建名为 的 ColumnHandlers 子项, (CLSID) GUID。 有关如何注册 Shell 扩展处理程序的一般讨论,请参阅 创建 Shell 扩展处理程序。 下面的示例演示如何注册列处理程序。

HKEY_CLASSES_ROOT
   Folder
      shellex
         ColumnHandlers
            {My Column Handler CLSID GUID}

实现列处理程序

与所有 Shell 扩展处理程序一样,列处理程序是作为 DLL 实现 (COM) 对象实现的进程内组件对象模型。 除了 IUnknown 之外,还导出 IColumnProvider 接口。

Windows 资源管理器调用 IColumnProvider 导出的三种方法,以请求显示列所需的信息。 Windows 资源管理器使用的过程是:

  1. 调用 IColumnProvider::Initialize 以指定即将显示的文件夹。
  2. 调用 IColumnProvider::GetColumnInfo 以检索列的标识符和特征。
  3. 如果用户已选择列,请为文件夹中的每个文件调用 IColumnProvider::GetItemData ,以检索属于该文件的列条目中的数据。

Initialize 方法

Windows 资源管理器调用 IColumnProvider::Initialize 来初始化列处理程序。 方法有三个参数,但当前仅使用 wszFolder 。 它设置为要显示其详细信息视图的文件夹。 存储文件夹名称供以后使用,并根据需要初始化处理程序对象。

GetColumnInfo 方法

Windows 资源管理器接下来调用 IColumnProvider::GetColumnInfo 来请求列的标识符和特征。 它传入 dwIndex 参数中列的索引。 此索引是用于枚举列的任意值。 Windows 资源管理器还会传入指向 SHCOLUMNINFO 结构的指针。 此结构用于返回列的标识符和特征。 IColumnProvider::GetColumnInfo 应将适当的值分配给 结构的成员并返回 。

列由其 OLE 属性集 ID (FMTID) 和关联的属性 ID (PID) 标识。 SHCOLUMNINFO 结构的第一个成员 scid 是指向用于标识列的 SHCOLUMNID 结构的指针。 其 fmtid 成员保存列的 FMTID,其 pid 成员保存列的 PID。 例如,通常用于标识列的标准 FMTID/PID 对是“摘要信息”属性集的 Author PID。

如果可能,处理程序应使用现有的 FMTID 和 PID 来标识它支持的列。 如果使用自定义 SHCOLUMNID 结构,该列将仅显示处理程序支持的文件的数据。 如果文件夹包含其他文件,则其条目将为空。 如果文件夹包含多个文件类型中的文件,则使用标准 FMTID/PID 值可以将不同类型的数据合并到同一列中。

vt 成员设置为要在列中显示的数据的 VARIANT 类型。 最常用的类型是VT_LPSTR,因为大多数列将其数据显示为字符串。 SHCOLUMNINFO 结构的其余成员用于定义列的特征。 根据需要分配值。

GetItemData 方法

如果已选择列处理程序的列,Windows 资源管理器将为要显示的文件夹中的每个文件调用 IColumnProvider::GetItemDatapscid 参数是指向标识列的 SHCOLUMNID 结构的指针。 pscd 参数指向标识特定文件的 SHCOLUMNDATA 结构。

pvarData 参数返回应在 pscd 指定的文件的处理程序列中显示的数据。 如果列处理程序支持该文件,请将其数据值分配给 pvarData 并返回S_OK。 如果列处理程序不支持该文件,则返回S_FALSE而不将值分配给 pvarData

许多文件夹将包含许多不受任何特定列处理程序支持的文件。 为了提高效率,IColumnProvider::GetItemData 应首先检查 pscd 指向的结构的 pwszExt 成员。 此成员保存文件扩展名。 如果扩展名指示文件不是处理程序支持的文件类型的成员,请立即返回S_FALSE,以避免不必要的处理。