创建磁盘清理处理程序

在计算机世界中,一次又一次的公理是,无论计算机的存储容量大小如何,你最终都会填满它。 虽然计算机硬盘的平均大小随时间推移而急剧增加,但应用程序也相应地增长,使用户在寻找创建更多可用硬盘空间的方法。 应用程序出于备份或性能原因创建的许多临时文件也会减少可用空间。 磁盘空间不足时,有必要减少应用程序使用的空间量。 可以使用多种方法释放磁盘空间,包括:

  • 正在删除文件。
  • 压缩文件。
  • 将文件移动到备份介质。
  • 将文件传输到远程服务器。

适合清理的文件包括:

  • 用户再也不需要的文件。
  • 仅出于性能原因而存在的临时文件。
  • 可根据需要从安装 CD 还原的文件。
  • 可能已被较新版本取代的数据文件,例如旧备份文件。
  • 长时间未使用的旧文件。

删除特别适用于用户不再需要的文件,例如,由于性能原因暂时缓存的文件。 删除也适用于易于还原的文件,例如可从安装 CD 重新加载的图形文件。 用户稍后可能需要的文件或难以重建的文件更适合用于压缩或备份。

期望用户手动清理文件系统并不是一个好的解决方案。 用户可能不知道许多文件位于何处,也不知道如何识别哪些文件可以安全删除。 此外,用户还存在删除基本文件的风险。

本主题讨论了磁盘清理实用工具的以下方面。

Windows 磁盘清理实用工具

从 Windows 98 开始,Windows 操作系统包括“磁盘清理”,这是一种使用户能够更轻松地管理可用硬盘空间的实用工具。 磁盘清理实用工具旨在释放尽可能多的磁盘空间,并降低用户意外删除重要文件的风险。

可以通过三种方式启动磁盘清理。

  • 用户可以通过单击“ 启动”启动来启动磁盘清理;指向 “所有程序”、“ 附件”和 “系统工具”;然后单击“ 磁盘清理”。
  • 系统通过消息框通知用户未使用的磁盘空间已达到关键模式。 大于 2.25 GB (GB) 驱动器的关键模式阈值为 200 MB (MB) 。 后续警告的速率为 80、50 和 1 MB。 用户可以选择手动释放磁盘空间或启动磁盘清理实用工具。
  • 用户可以将 Windows 计划任务向导 (称为旧系统上的维护向导) 在计划时间自动运行磁盘清理实用工具。

磁盘清理中固有的基本挑战是在不删除基本文件的情况下释放尽可能多的磁盘空间。 由于没有标准方法来标记要清理的文件,因此没有一个应用程序能够可靠地检测和清理所有 unessential 文件。 磁盘清理实用工具通过在单个 磁盘清理管理器 和磁盘清理 处理程序集合之间拆分清理操作来解决此问题。

运行磁盘清理实用工具时,用户会看到以下对话框。 (如果计算机上存在多个磁盘或磁盘分区,则首先要求用户在显示此对话框之前选择驱动器。)

“清理”对话框的屏幕截图

磁盘清理管理器是操作系统的一部分。 它显示上图中显示的对话框,处理用户输入,并管理清理操作。 不需要的文件的实际选择和清理由磁盘清理管理器列表框中显示的各个磁盘清理处理程序完成。 用户可以通过在磁盘清理管理器的 UI 中选择或清除其检查框来启用或禁用单个处理程序。

每个处理程序负责一组定义完善的文件。 例如,图中选定的处理程序负责清理下载的程序文件。 图中所选的处理程序还提供 “查看文件” 按钮。 通过单击该按钮,用户可以请求处理程序显示 UI(通常为 Windows 资源管理器窗口),该窗口允许用户指定要清理的文件或文件类。

尽管 Windows 附带许多磁盘清理处理程序,但它们不用于处理其他应用程序生成的文件。 相反,磁盘清理管理器设计为灵活且可扩展,使任何开发人员都可以实现和注册自己的磁盘清理处理程序。 任何开发人员都可以通过实现和注册磁盘清理处理程序来扩展可用的磁盘清理服务。

生成临时文件的所有应用程序都可以而且应该实现并注册磁盘清理处理程序。 这样一来,用户便能以方便可靠的方式管理应用程序的临时文件。 实现处理程序时,可以决定哪些文件受到影响,并确定实际清理的发生方式。

实现基础知识

清理处理程序是进程内服务器组件对象模型 (COM) 对象。 Windows 提供一个名为 DataDrivenCleaner 的现有处理程序对象供你使用。 为了提高灵活性,还可以选择自己实现处理程序。 然后,这些对象允许你指定如何选择文件、释放磁盘空间,并且对于已实现的处理程序,则显示可选 UI 以进行更精细的控制。 本部分介绍实现自己的处理程序的问题。 有关 DataDrivenCleaner 对象的使用的详细信息,请参阅 使用 DataDrivenCleaner 对象

磁盘清理处理程序应执行这五个基本任务。

  • 初始化处理程序对象。
  • 扫描磁盘以确定可以释放多少磁盘空间。
  • 显示 UI 以获取用户关于要清理的文件的反馈。 (可选)
  • 执行清理。
  • “关机”。

若要允许磁盘清理管理器管理这些任务,处理程序必须导出适用于 Windows 98 的 IEmptyVolumeCache 或适用于 Windows Millennium Edition 的 IEmptyVolumeCache2 (Windows Me) 、Windows 2000 和 Windows XP。 由于 IEmptyVolumeCache2 继承自 IEmptyVolumeCache,因此仅添加其他方法 InitializeEx,因此实现两者所需的额外工作相对较少。 除非处理程序仅用于其中一个操作系统,否则它应导出这两个接口。

若要导出这些接口,必须实现与五个基本任务对应的这些方法。

Initialize/InitializeEx

运行磁盘清理实用工具时,会调用两种非常相似的初始化方法。 Windows 98 磁盘清理管理器调用处理程序的 IEmptyVolumeCache::Initialize 方法。 Windows Millennium Edition (Windows Me) 、Windows 2000 或 Windows XP 磁盘清理管理器,但是,首先尝试调用 IEmptyVolumeCache2::InitializeEx ,并且仅使用 IEmptyVolumeCache::Initialize (如果处理程序未公开 IEmptyVolumeCache2 )。 磁盘清理管理器将信息传递给 方法,例如处理程序的注册表项和要清理的磁盘卷。

任一方法都可以返回各种显示字符串并设置一个或多个标志。 这两种方法之间的主要区别在于如何处理磁盘清理管理器中显示的文本。 以下三个字符串受到影响。

字符串 目的 Initialize InitializeEx
显示名称 处理程序的名称显示在磁盘清理管理器的列表框中。 如果 ppwszDisplayNameNULL,则从注册表中检索默认值。 必须在 ppwszDisplayName 中指定正确本地化的字符串,不使用注册表值。
说明 选择处理程序名称时,列表框下方显示的描述性文本。 如果 ppwszDescriptionNULL,则从注册表中检索默认值。 必须在 ppwszDescription 中指定正确本地化的字符串,不使用注册表值。
按钮文本 允许用户显示处理程序 UI 的可选按钮的文本。 没有可用的参数。 必须在注册表中指定。 必须在 ppwszBtnText 中指定正确本地化的字符串,不使用注册表值。

在两种初始化方法中找到的 pdwFlags 参数可识别同一组标志。 其中两个标志由磁盘清理管理器传递到 方法。

  • EVCF_SETTINGSMODE

    如果磁盘清理管理器正在按计划运行,它将设置 EVCF_SETTINGSMODE 标志。 如果设置了此标志,磁盘清理管理器不会调用 GetSpaceUsedPurgeShowProperties 方法。 处理程序的 InitializeInitializeEx 方法必须处理 通常由 GetSpaceUsedPurge 执行的所有任务。 由于没有机会获得用户反馈,因此应仅接触那些非常安全清理的文件。 应忽略初始化方法的 pcwszVolume 参数,并清除不需要的文件,而不考虑它们位于哪个驱动器上。

  • EVCF_OUTOFDISKSPACE

    如果设置了 EVCF_OUTOFDISKSPACE 标志,则用户的磁盘驱动器空间严重不足。 处理程序应该积极删除文件,即使它会导致性能损失。 但是,处理程序显然不应删除会导致应用程序失败或用户丢失数据的文件。

其余标志由磁盘清理处理程序设置,并返回到磁盘清理管理器。 有关详细信息,请参阅 IEmptyVolumeCache::InitializeIEmptyVolumeCache2::InitializeEx 的方法参考页。

  • EVCF_DONTSHOWIFZERO

    仅当 GetSpaceUsed 返回的值指示处理程序可以释放一些磁盘空间时,才在磁盘清理管理器的列表框中显示处理程序。

  • EVCF_ENABLEBYDEFAULT

    指定默认情况下启用处理程序。 除非用户通过清除磁盘清理管理器处理程序列表中的检查框来禁用磁盘清理,否则它将在每次进行磁盘清理时运行。

  • EVCF_ENABLEBYDEFAULT_AUTO

    指定自动启用处理程序以在计划的清理期间运行。

  • EVCF_HASSETTINGS

    如果处理程序有要显示的 UI,请设置此标志。 作为响应,在列表框中选择该处理程序时,磁盘清理管理器会显示一个按钮。 如果单击该按钮,磁盘清理管理器将调用 ShowProperties

  • EVCF_REMOVEFROMLIST

    运行处理程序一次后,请从可用处理程序列表中删除处理程序的名称。 处理程序的注册表信息也会被删除。

GetSpaceUsed

磁盘清理管理器调用此方法来确定磁盘清理处理程序可以释放多少空间。 然后,磁盘清理管理器会在列表框中处理程序名称右侧显示该值。 在管理器启动时和管理器的main UI 显示之前,将在向磁盘清理管理器注册的所有处理程序上执行此操作。 调用 GetSpaceUsed 时,处理程序应扫描它负责的文件,确定其中哪些是清理候选项,并返回它可以释放的磁盘空间量。

由于扫描过程可能很长,因此磁盘清理管理器使用此方法的 picb 参数将指针传递到 IEmptyVolumeCacheCallBack 接口。 处理程序在扫描期间定期使用 接口来调用 IEmptyVolumeCacheCallBack::ScanProgress,这有两个用途。

  • 允许磁盘清理管理器更新进度栏,通知用户扫描进度。
  • 如果单击进度窗口的“ 取消 ”按钮,则通知处理程序停止扫描。 该按钮事件不会直接传达给处理程序;相反,当 GetSpaceUsed 下次调用 IEmptyVolumeCacheCallBack::ScanProgress 时,磁盘清理管理器将返回E_ABORT。

ShowProperties

在开始清理之前,处理程序可以通常以 Windows 资源管理器窗口的形式显示 UI,它允许用户查看处理程序选择清理的文件或文件类的列表。 如果在调用 InitializeInitializeEx 时处理程序设置EVCF_HASSETTINGS标志,则用户可以通过单击磁盘清理管理器中显示的按钮来请求 UI。 按钮文本因处理程序而异,但“查看文件”、“查看页面”和“选项”是常见标签。

单击按钮时,磁盘清理管理器会调用 ShowProperties 来提示处理程序显示 UI。 UI 应创建为窗口的子级,该窗口的句柄在 ShowProperties 方法的 hwnd 参数中传递。

清除

磁盘清理管理器调用处理程序的 Purge 方法,以设置清除操作。 方法的 picb 参数是指向磁盘清理管理器的 IEmptyVolumeCacheCallBack 接口的指针。 与 GetSpaceUsed 方法一样,处理程序应定期使用回调接口来报告其进度,并查询磁盘清理管理器,以便用户是否单击了 “取消”。 但请注意, Purge 方法必须调用 IEmptyVolumeCacheCallBack::P urgeProgress,而不是 ScanProgress

停用

当磁盘清理管理器准备关闭时,将调用 Deactivate 方法。 处理程序应执行任何所需的清理任务并返回。 如果不希望再次运行处理程序,请在初始化方法的 pdwFlags 参数中设置EVCF_REMOVEFROMLIST标志。 如果设置了此标志,磁盘清理管理器将从其列表中删除处理程序,并删除处理程序的注册表项。 必须重新添加注册表项才能再次运行处理程序。 此标志通常用于仅运行一次的处理程序。

注册磁盘清理处理程序

若要将处理程序添加到磁盘清理管理器的列表,必须将某些键和值添加到 Windows 注册表。

注册处理程序的 CLSID

与所有 COM 对象一样,处理程序对象的 GUID 和 DLL 必须在 HKEY_CLASSES_ROOT 中的 CLSID 键下注册。 还可以注册一个图标,该图标显示在磁盘清理管理器的列表框中处理程序的名称旁边,但这是可选的。 以下示例显示了所涉及的键、值和数据。

HKEY_CLASSES_ROOT
   CLSID
      Handler's GUID
         DefaultIcon
            (Default) = Handler's Icon Path, Icon Index
         InprocServer32
            (Default) = Handler's DLL path
            ThreadingModel = Apartment

向磁盘清理管理器注册处理程序:常规

若要完成注册,处理程序必须添加一个包含其详细信息的密钥,如下所示。 本部分的其余部分讨论此密钥的内容。

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  VolumeCaches
                     Handler's Key

通常,保存处理程序的详细信息的键的名称是为其处理的文件的类型(例如 “已下载的程序文件”)命名的,但这不是一项要求。 下表详细介绍了在此键下找到的可能值。

注意

只有指定处理程序的类标识符的默认值 (CLSID) 是必需的,所有其他值都是可选的。

类型 含义
默认 REG_SZ 处理程序的 CLSID 在 HKEY_CLASSES_ROOT\CLSID 下注册。
AdvancedButtonText REG_SZ 用户可单击以显示处理程序 UI 的可选按钮的文本。 可以将&字符放在字符前面,以便为按钮分配键盘快捷方式。 公开 IEmptyVolumeCache2::InitializeEx 的处理程序会忽略 AdvancedButtonText 值。
CleanupString REG_SZ 指定可执行文件和可选命令行参数的命令行。 此命令行在完成磁盘清理后运行。
CSIDL REG_DWORD 要包含在文件搜索中的特殊文件夹的系统无关标识符。 此值必须作为数字值输入,例如,0x0000001c而不是CSIDL_LOCAL_APPDATA。 有关可能值的列表,请参阅 CSIDL。 只能使用单个值。
如果指定了 Folder 值,CSIDL 值指示的位置将追加到该信息前面,以构成搜索路径。 例如,请考虑以下方案。
  • CSIDL 值指定为 0x0000000d (CSIDL_MYMUSIC)
  • “我的音乐”文件夹位于 C:\Documents and Settings\username\My Music
  • Folder 值包含“Jazz\Singers”
这种情况的结果是磁盘清理处理程序搜索 C:\Documents and Settings\username\My Music\Jazz\Singers 文件夹。 请注意,如果文件夹值不存在,则会添加文件夹值前面的斜杠。
说明 REG_SZ 选择处理程序名称时,磁盘清理管理器列表框下方显示的描述性文本。 在这里,你可以解释处理程序的作用、它涉及哪些文件,以及向用户提供的任何其他信息。 如果处理程序未公开 IEmptyVolumeCache2::InitializeEx ,则调用该方法时,可以通过处理程序的 IEmptyVolumeCache::Initialize 方法重写此文本,方法是在 ppwszDescription 参数中指定备用字符串。
显示 REG_SZ 要显示在磁盘清理管理器列表框中的处理程序的名称。 如果处理程序未公开 IEmptyVolumeCache2::InitializeEx ,则调用该方法时,可以通过处理程序的 IEmptyVolumeCache::Initialize 方法重写此文本,方法是在 ppwszDisplayName 参数中指定备用字符串。
FileList REG_SZ或REG_MULTI_SZ 此处理程序搜索和清理的文件列表。 可以使用 ? 指定通配符 或 * 个字符。 如果值的类型为 REG_SZ,则使用 | 分隔多个扩展或 :字符,两侧均无空格。
如果在 Flags 值中设置了DDEVCF_REMOVEDIRS标志,则这些值可以指定目录名称和文件。
Flags REG_DWORD或REG_BINARY 标记控制搜索和清理过程的元素。 以下一个或多个值。
  • DDEVCF_DOSUBDIRS (0x00000001) 。 以递归方式搜索和删除。
  • DDEVCF_REMOVEAFTERCLEAN (0x00000002) 。 运行处理程序一次后,请将其从注册表中删除。
  • DDEVCF_REMOVEREADONLY (0x00000004) 。 删除符合搜索条件的文件,即使这些文件是只读的。
  • DDEVCF_REMOVESYSTEM (0x00000008) 。 删除符合搜索条件的文件,即使它们是系统文件。
  • DDEVCF_REMOVEHIDDEN (0x00000010) 。 删除符合搜索条件的文件,即使它们是隐藏文件。
  • DDEVCF_DONTSHOWIFZERO (0x00000020) 。 如果没有文件与其搜索条件匹配,请不要在磁盘清理管理器中显示此处理程序。
  • DDEVCF_REMOVEDIRS (0x00000040) 。 将 FileList 值与目录匹配,并删除匹配项及其所有子目录。
  • DDEVCF_RUNIFOUTOFDISKSPACE (0x00000080) 。 仅当可用磁盘空间低于临界值(由磁盘清理管理器通过 IEmptyVolumeCache::Initialize 或 IEmptyVolumeCache2::InitializeEx 设置EVCF_OUTOFDISKSPACE标志确定)时才运行此处理程序。
  • DDEVCF_REMOVEPARENTDIR (0x00000100) 。 运行清理程序后,删除指定文件的父目录。
  • DDEVCF_PRIVATE_LASTACCESS (0x10000000) 。 使用 LastAccess 值(如果提供)来确定应清理哪些文件。 使用 DataDrivenCleaner 时,始终使用任何提供的 LastAccess 值时,将忽略此标志。
文件夹 REG_SZ、REG_MULTI_SZ 或 REG_EXPAND_SZ 一个或多个特定文件夹,用于搜索与 FileList 值中的项匹配的项目。 可以使用 ? 指定通配符 或 * 个字符。 如果值的类型为 REG_SZ,则使用 | 分隔多个文件夹名称字符,两侧不带空格。
如果存在 CSIDL 值,则此值中只能指定一个文件夹。 CSIDL 值指示的位置将附加到该文件夹路径以撰写搜索路径。 有关示例,请参阅 CSIDL 值说明。
如果在 Windows Vista Service Pack 1 (SP1) 及更高版本中不存在此值,则会忽略清理处理程序,并在初始化时返回S_FALSE。
如果在原始版本的 Windows Vista 及更早版本中不存在此值,则使用当前卷的根文件夹。 在这种情况下,需要DDEVCF_DOSUBDIRS标志来搜索整个驱动器。 如果没有它,则仅搜索根文件夹本身。
必须指定一个或多个驱动器。 这可以通过 CSIDL 值或通过REG_EXPAND_SZ字符串提供。 但是,除了这些选项外,必须在文件夹名称中指定要搜索的驱动器。 使用 ?: 搜索当前驱动器上的文件夹。
IconPath REG_SZ或REG_EXPAND_SZ 要从中获取要与处理程序关联的图标的资源的路径。
LastAccess REG_DWORD或REG_BINARY 自上次访问某个文件或为该文件或目录创建目录以来必须经过的天数,以便考虑进行清理。
优先级 REG_DWORD或REG_BINARY 确定处理程序相对于其他处理程序的运行顺序。 数字越高,处理程序运行的进程越早。 没有定义范围,任何数字都是可以接受的。
PropertyBag REG_SZ 用于为显示名称、说明和按钮文本提供本地化文本的资源的 CLSID。 如果处理程序未实现 IEmptyVolumeCache,并且处理程序正在 Microsoft Windows NT 或 Windows XP 下运行,则此资源非常有用。
磁盘清理管理器首先检查处理程序的初始化例程是否返回了这些字符串,就像实现 IEmptyVolumeCache2 时一样。 如果失败,经理接下来会转向此值中名为 的属性包。 如果未提供任何内容,则会从注册表中检索文本。
StateFlags REG_DWORD 通过从命令行Cleanmgr.exe运行磁盘清理管理器的可执行文件,可以声明清理 配置文件。 这些配置文件由可用处理程序的子集组成,并具有唯一的数字标签。 这样,就可以在不同时间自动运行不同的处理程序集。
命令行“cleanmgr.exe /sageset:nnnn”显示一个 UI,其中 nnnn 是一个唯一的数字标签,用于选择要包含在该配置文件中的处理程序。 除了定义配置文件,sageset 参数还会将名为 StateFlagsnnnn 的值写入 VolumeCaches 下的所有子项,其中 nnnn 是参数中使用的标签。 这些条目有两个可能的数据值。
  • 0:运行此配置文件时不运行此处理程序。
  • 2:运行此配置文件时包含此处理程序。

例如,假设运行命令行“cleanmgr.exe /sageset:1234”。 在显示的 UI 中,用户选择 “已下载的程序文件”,但不选择 “临时 Internet 文件”。 然后将以下值写入注册表。
HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  VolumeCaches
                     Downloaded Program Files
                        StateFlags1234 = 0x00000002
                     Internet Cache Files
                        StateFlags1234 = 0x00000000

命令行“cleanmgr.exe /sagerun:nnnn”,其中 nnnn 的值与使用 sageset 参数声明的标签匹配,运行该配置文件中选择的所有处理程序。
正常运行磁盘清理时,会将泛型 StateFlags 值写入注册表。 此值只是存储处理程序 (选中或未选中的状态,) 上次将其作为选项呈现给用户时。 这些条目有两个可能的数据值。
  • 0:未选择处理程序。
  • 1:已选择处理程序。

向磁盘清理管理器注册处理程序:Windows 2000 或更高版本系统

在注册表中指定显示文本可能会使软件本地化变得困难。 因此,Windows 2000 和 Windows XP 支持 IEmptyVolumeCache2 接口及其首选初始化方法 InitializeEx。 在 Windows 2000 或更高版本下,始终尝试在 IEmptyVolumeCache::Initialize 之前调用 IEmptyVolumeCache2::InitializeEx。 仅当未公开 IEmptyVolumeCache2 时,系统才使用 Initialize 来初始化处理程序。

对于注册表,Windows 2000 或更高版本下的唯一区别是,当 处理程序公开 IEmptyVolumeCache2::InitializeEx 时,可以省略 AdvancedButtonText、Display 和 Description 值。 这些值(包含正确本地化的文本)在磁盘清理管理器调用 InitializeEx 时提供给磁盘清理管理器。

使用 DataDrivenCleaner 对象

操作系统提供了一个名为 DataDrivenCleaner 的基本磁盘清理处理程序。 若要将此对象用作处理程序而不是实现自己的处理程序,请使用 CLSID {C0E13E61-0CC6-11d1-BBB6-0060978B2AE6} 作为 VolumeCaches 下处理程序子项的默认值,如 向磁盘清理管理器注册处理程序:常规中所述。

DataDrivenCleaner 不公开 IEmptyVolumeCache2,因此显示值和说明值通过注册表提供。 声明这些字符串时,请注意,这可能会导致本地化问题。 可以通过 PropertyBag 值提供本地化文本。 将忽略 AdvancedButtonText 值,因为此处理程序没有 UI,因此没有用于显示它的按钮。

磁盘清理处理程序的示例注册

下面显示了电话公司实现的磁盘清理处理程序的示例注册。 此处理程序实现 IEmptyVolumeCacheIEmptyVolumeCache2,因此提供 AdvancedButtonText、Description 和 Display 值,以防它在运行 Windows 98 的计算机上使用。 处理程序组合 CSIDL 和 Folder 值以在 C:\Program Files\The Phone Company\Temp 目录中搜索文件,并设置DDEVCF_DOSUBDIRS标志,以便同时搜索其子目录。 仅考虑使用 .tmp 和 .tpc 扩展名的文件进行清理,并设置DDEVCF_PRIVATE_LASTACCESS标志,以便从这些文件中只考虑 14 天或更晚未访问的文件。 还设置了DDEVCF_DONTSHOWIFZERO标志,以便处理程序不会显示在列表中,除非它已找到清理候选项。

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  VolumeCaches
                     The Phone Company Files
                        (Default) = {the CLSID GUID}
                        AdvancedButtonText = &View Files
                        CleanupString = c:\tpc.exe
                        CSIDL = 0x00000026
                        Description = Old temporary files.
                        Display = The Phone Company Files
                        FileList = *.tmp|*.tpc
                        Flags = 0x10000021
                        Folder = \The Phone Company\Temp
                        IconPath = c:\Program Files\The Phone Company\tpc.dll,2
                        LastAccess = 0x0000000e
                        Priority = 200
                        PropertyBag = {Property Bag CLSID GUID}