Windows 机密成功解决兼容性问题

Raymond Chen

有一个程序 是针对 Windows® 3.1 编写的,它通过查找“控制面板”窗口、访问“文件”菜单并搜索名为“打印机”的项,以打开“打印机控制面板”。在 Windows 95 中,“控制面板”的“文件”菜单下没有“打印机”选项。因此,当在 Windows 95 上运行时,此程序会把垃圾命令消息发布到“控制面板”上。为解决这一问题,Windows 95 创建了一个诱捕“控制面板”窗口,以便该程序进行查找。当该程序将消息发布给诱捕窗口时,将打开“打印机”文件夹。

一些人指出,Windows 3.1 应该检测到该程序对“控制面板”做出了错误的假设,并显示警告。这样,程序的制作者会看到该警告并在发布产品之前修复该问题。但检测代码块的目的需要一定程度的分析,这涉及到人工智能领域。从根本上说,Windows 3.1 必须检测到该程序正在对打印机进行 strcmp,分析特定的 strcmp,并确定它是否错误。但这只适用于打印机的情形。您希望系统进行多少次兼容性检查?误报又怎么办呢?

另一个观点是,Windows 95 应对该错误的假设做出响应,并显示警告对话“Program XYZ is doing something bad.”但要让“控制面板”了解是谁发布了垃圾消息,则该检测必须放在窗口管理器中。这就会在“控制面板”和窗口管理器两个组件之间创建弱耦合。同样,这也只适用于一种情形。您是否希望窗口管理器与系统中的所有其他组件都建立弱耦合?

如果是一般消息,不指出具体的应用程序名会更容易一些。但这也不是好的解决办法。模糊的错误消息就跟没有错误消息是一样的。而且,该对话框很可能会被用户忽视 - 再加上它并不推荐具体的操作过程就尤其如此。用户会认为该对话框是干扰对话框。这一点非常重要。任何错误消息都必须有可操作信息。如果用户知道如何对警告采取应对措施,那么此对话框就有用了。

  

另一个问题就是由于对话循环,对话框会创建一个重入点。这是技术问题。异常的重入是 UI 编程中 Bug 的一个主要来源。而且,“控制面板”本身可能处于模式状态,显示对话框则会导致模式结构崩溃。

对话框还会造成新的本地化负担。如果为每个兼容性 hack 都编写一个对话框,那么在系统中将出现数百个对话框。每个对话框必须翻译成 33 种语言,Windows 将提供这 33 种语言的完整的翻译版本。

最后,还要考虑当使用竞争对手的产品导致出现以上一种对话框时,竞争对手的反应。他们会说“明明是 Microsoft 自身的操作系统有问题,却说是别人的错误”,“Microsoft 故意使我们的程序看上去有错误”等等诸如此类的话。我并不是夸大其词。的确有公司向国会控诉说 Microsoft 在恶意针对和禁用他们的软件。但经过进一步调查,发现他们的程序中存在 Bug。坦白说,为他们修复 Bug 比忍受长时间的国会调查要好得多。

因此,当程序与 Windows 不兼容以致于程序无法运行或运行受到严重限制时,当前版本的 Windows 只显示警告对话。即使在这种情况下,Microsoft 仍试图与供应商合作,以确保帮助所有客户摆脱困境。毕竟人们希望能够在其购买的操作系统上运行程序。如果程序无法工作,您不会关心这是谁的错误 - 您只希望完成您的工作。

Raymond Chen 的网站,The Old New Thing,关于 Windows 历史和 Win32 编程。他正在编写一本书,恰巧书名也叫 The Old New Thing (Addison-Wesley, 2007)。

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