Windows 机密平均分配

Raymond Chen

您是否曾问过: 为什么是在卸载程序时,Windows® 会问是否应该删除“可能会使其他应用程序无法正常运行”的文件?首先要说的是,此消息(如屏幕快照中所示)并不是来自 Windows 的消息,它实际上来自卸载程序。因此,正确的问题应该是“为什么应用程序卸载程序会显示该对话框呢”?通常用户都很难回答这个问题。那么,是什么造成了这种境况呢?

为了管理由多个应用程序(例如供多个不相关程序使用的 MFC 运行时库)使用的文件的引用计数,安装程序需要在 SharedDLLs 注册键下创建一个项。该项列出文件及其引用计数。如果已经存在文件的项,则引用计数将递增。如果该项尚不存在,则引用计数将设置为 1。反之,当卸载该程序时,引用计数将递减,并且当其减为 0 时,将删除该文件,因为没有程序会再使用该文件。至少理论上讲是这样的。

Should I delete it or not?

Should I delete it or not?  (单击该图像获得较大视图)

此模型的一个严重的问题是它假定所有程序都遵守此规则。但实际上大量程序并没有遵守此规则,因为即使不遵守此规则,通常也不会带来任何负面结果。

例如,假设某个程序使用了 MFC 运行时库,而该程序的安装程序仅把这些库复制到系统目录,却并未更新引用计数。随后,当卸载该程序时,它只会删除这些库。现在考虑一下当该程序与遵守规则的程序共存时会发生什么情况。以下是基本的工作情况:

  1. 安装遵守规则的程序:它将安装库,并将引用计数设置为 1。
  2. 安装不遵守规则的程序:它将安装库,但不会更新引用计数。
  3. 卸载不遵守规则的程序:库将被删除。

其结果是遵守规则的程序将由于缺少库而无法工作。

以下是另一种情形:

  1. 安装遵守规则的程序:它将安装库,并将引用计数设置为 1。
  2. 安装不遵守规则的程序:它将安装库,但不会更新引用计数。
  3. 卸载遵守规则的程序:引用计数减小到零,库将被删除。

这种情况的结果是不遵守规则的程序将无法工作。

遵守规则程序的编写者指出,“虽然我们无法阻止不遵守规则的程序破坏我们,但至少我们能够尝试使自己不要破坏不遵守规则的程序”。因此,将要删除某个文件时,程序将停止并显示警告消息:“哦,各位,我马上要删除这个文件了,没问题吧?如果还有不遵守规则的程序仍在使用此文件,那可能会破坏这些程序。如果安装了不遵守规则的程序,那您应该单击不删除”。虽然这并不是实际显示出来的内容,但您应该已经知道我指的是哪个对话框。甚至富有远见卓识的 Jeffrey Richter 也曾在 1996 年 Microsoft Systems Journal 文章中推荐采用此方法。

遗憾的是,这样做却给用户们带来了难以正确回答的问题。

当然,所有那些要求 Windows 为其提供涵盖每个事件选项的控制狂们应该会为此对话框喝彩。实际的卸载程序将在卸载过程中为您提供对每个文件的控制。所以对您需要的东西要千万小心啊。

Raymond Chen 的网站“The Old New Thing”及同名著作讲述了 Windows 的发展历程和 Win32 编程。他很想知道自己是否能看到重大的技术改变。

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.