【问题标题】:How to use the IsWindowsXPOrGreater function correctly?如何正确使用 IsWindowsXPOrGreater 函数?
【发布时间】:2015-02-24 07:18:21
【问题描述】:

更新

我已经重写了原来的问题,因为之前的文字更像是一个故事而不是描述我的真正问题:

我们有一组针对 Windows XP 至 Windows 8.1 以及 Windows Server 2008 和 2012(也支持 32 位/64 位版本)的应用程序。以前我们没有在代码中做任何事情来确保您在这些平台上运行。

在创建我们的一组 Windows API 包装类时,我们进行了更改以使用 IsWindowsXPOrGreater 函数调用。如果此调用返回 false,我们将抛出异常,该异常将被捕获并导致显示错误消息。

但是,错误消息是通过跳过一组 Windows API 调用创建的。根据 MSDN,大多数调用都需要 Windows 2000 或更高版本,尽管少数是 Windows XP 或更高版本。

在实施单元测试和 mod 之后,我怀疑如果我们在 Windows XP 之前的任何设备上实际运行该软件,代码是否会真正运行 - 因为 IsWindowsXPOrGreater 函数需要 Windows 2000 或更高版本,或者错误消息模块将调用 Windows API 失败。

我已经向我的同事表明,如果我强制 IsWindowsXPOrGreater 给出错误返回,则会引发异常,但我们最终会陷入无限循环,因为我们的错误消息模块引发了另一个异常实例,我们再次拾取尝试使用 Windows API 等。

问题

如果IsWindowsXPOrGreater 返回 false,哪些 Windows API 调用可以安全地用于任何 32 位安装的 Windows 操作系统?

对于大多数 Windows API 功能,MSDN 似乎至少显示了 Windows 2000 或 Windows XP。 User32.dll、Kernel32.dll 等的早期版本是否有任何文档?

我目前的解决方法

此后,我们更改了代码以捕获新的LowerThanWindowsXPException - 它将使用MessageBox 的变体包装器在终止应用程序之前显示一条简单的消息。此变体不检查 Windows 版本,并且基于我们现有的一些旧版 Visual Basic 代码。这在 Windows 95 上有效,尽管我们现在无法检查。

未来我们将使用IsWindows7OrGreater 进行额外的 Windows API 调用,在这些情况下,我们将引发 LowerThanWindows7Exception - 我们可以捕获并区别对待(例如使用我们的 Windows XP API 调用来显示错误消息或回退到一些替代功能)。

【问题讨论】:

  • 这是太多的文字,但如果有人使用比 Windows XP 更早的东西而你不知道,你可能不应该关心他们。
  • 我已经读了两遍了,我仍然无法弄清楚你在问什么。
  • 如果没有 used 将在 XP 之前的系统上运行,那你为什么要检查呢?
  • @DavidHeffernan - 我已经完全重新措辞以使其清楚,或者至少不是一个故事
  • 您想要完整的在 NT4 和 Win2k 上可用的 API 列表吗?

标签: c++ windows winapi visual-studio-2013


【解决方案1】:

您可以在链接时使用/DELAYLOAD,这样您的应用程序只会在您从该 DLL 调用函数时尝试加载 DLL。

从那里,如果没有足够新的 Windows 版本,您可以使用旧功能打印错误消息。举一个明显的例子,MessageBox 从 16 位 Windows 时代就已经存在。使用它,任何回到 Windows 95 和/或 Windows NT 3.1 的 32 位 Windows 系统都将毫无问题地打印出您的错误消息。 LoadString 是另一个自诞生之日起就存在的东西,因此使用它也不会对旧版本的 Windows 造成问题。

基本上,它不起作用的唯一方法是如果他们在没有安装 Win32s 的纯 16 位 Windows 系统(Windows 3.1 或更早版本)上运行它,在这种情况下他们只会收到一条消息说 Windows 可以' t 加载可执行文件。如果有人还在运行 16 位 Windows,那么他们现在可能已经习惯了。

【讨论】:

  • 如果任何 *32.dll 加载失败,我们认为程序失败没有问题。您对 MessageBox 的建议很有帮助,我们能够在 VB 中挖掘出一些遗留代码,看看它是如何在 Windows 95 机器上使用的。
猜你喜欢
  • 2017-08-19
  • 2014-04-22
  • 2021-02-03
  • 2011-12-22
  • 2016-12-21
  • 2010-11-16
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多