如何正确使用IsWindowsXPOrGreater函数?
How to use the IsWindowsXPOrGreater function correctly?
更新
我重写了原来的问题,因为之前的文字更像是一个故事,而不是描述我真正的问题:
我们有一组应用程序针对 Windows XP Windows 8.1,以及 Windows Server 2008 和 2012(也支持 32-bit/64-bit 版本) .以前我们在代码中没有做任何事情来确保您在这些平台上 运行ning。
我们在创建 Windows API 包装器集 类 时更改为使用 IsWindowsXPOrGreater
函数调用。如果此调用 returns false 我们抛出异常,该异常将被捕获并导致显示错误消息。
但是,错误消息是通过跳过一组 Windows API 调用而创建的。根据 MSDN,大多数调用需要 Windows 2000 或更高版本,尽管少数是 Windows XP 或更高版本。
在实施单元测试和 mod 之后,我开始怀疑代码实际上 运行 如果我们实际上 运行 在 Windows XP 之前的任何软件上 -因为 IsWindowsXPOrGreater
函数需要 Windows 2000 或更高版本,或者错误消息 module 将在调用 Windows API.[=18= 时失败]
我已经向我的同事们表明,如果我强制 IsWindowsXPOrGreater
给出错误的 return,则会引发异常,但我们最终会陷入无限循环,因为我们的错误消息 mod ule 引发了另一个异常实例,我们再次选择它来尝试使用 Windows API 等等。
问题
If IsWindowsXPOrGreater
returns false 哪些 Windows API 调用可以安全地用于 Windows 操作系统的任何 32 位安装?
MSDN 似乎显示大多数 Windows API 功能至少需要 Windows 2000 或 Windows XP。是否有 User32.dll、Kernel32.dll 等早期版本的文档?
我当前的解决方法
我们更改了代码以捕获新的 LowerThanWindowsXPException
- 它将使用 MessageBox
的变体包装器在终止应用程序之前显示一条简单消息。此变体不检查 windows 版本,并且基于我们现有的一些遗留 Visual Basic 代码。这在 Windows 95 上有效,尽管我们现在无法检查。
将来我们将使用 IsWindows7OrGreater
进行额外的 Windows API 调用,在这些情况下我们将提出 LowerThanWindows7Exception
- 我们可以捕获并处理不同的方式(例如使用我们的 Windows XP API 调用来显示错误消息或退回到某些替代功能)。
您可以在 link 时使用 /DELAYLOAD,这样您的应用程序只会在您从 DLL 调用函数时尝试加载 DLL。
如果 Windows 的新版本不可用,您可以从那里使用旧函数打印错误消息。仅举一个明显的例子,MessageBox
从 16 位 Windows 时代就已经存在了。使用它,任何 32 位 Windows 系统回到 Windows 95 and/or Windows NT 3.1 将毫无问题地打印出您的错误消息。 LoadString 是另一个自古以来就存在的东西,因此使用它不会对旧版本的 Windows 造成问题。
基本上,如果他们 运行 在没有安装 Win32s 的纯 16 位 Windows 系统(Windows 3.1 或更早版本)上,它就无法工作,在这种情况下,他们只会收到一条消息说 Windows 无法加载可执行文件。如果还有人 运行宁 16 位 Windows,他们现在可能已经很习惯看到它了。
更新
我重写了原来的问题,因为之前的文字更像是一个故事,而不是描述我真正的问题:
我们有一组应用程序针对 Windows XP Windows 8.1,以及 Windows Server 2008 和 2012(也支持 32-bit/64-bit 版本) .以前我们在代码中没有做任何事情来确保您在这些平台上 运行ning。
我们在创建 Windows API 包装器集 类 时更改为使用 IsWindowsXPOrGreater
函数调用。如果此调用 returns false 我们抛出异常,该异常将被捕获并导致显示错误消息。
但是,错误消息是通过跳过一组 Windows API 调用而创建的。根据 MSDN,大多数调用需要 Windows 2000 或更高版本,尽管少数是 Windows XP 或更高版本。
在实施单元测试和 mod 之后,我开始怀疑代码实际上 运行 如果我们实际上 运行 在 Windows XP 之前的任何软件上 -因为 IsWindowsXPOrGreater
函数需要 Windows 2000 或更高版本,或者错误消息 module 将在调用 Windows API.[=18= 时失败]
我已经向我的同事们表明,如果我强制 IsWindowsXPOrGreater
给出错误的 return,则会引发异常,但我们最终会陷入无限循环,因为我们的错误消息 mod ule 引发了另一个异常实例,我们再次选择它来尝试使用 Windows API 等等。
问题
If IsWindowsXPOrGreater
returns false 哪些 Windows API 调用可以安全地用于 Windows 操作系统的任何 32 位安装?
MSDN 似乎显示大多数 Windows API 功能至少需要 Windows 2000 或 Windows XP。是否有 User32.dll、Kernel32.dll 等早期版本的文档?
我当前的解决方法
我们更改了代码以捕获新的 LowerThanWindowsXPException
- 它将使用 MessageBox
的变体包装器在终止应用程序之前显示一条简单消息。此变体不检查 windows 版本,并且基于我们现有的一些遗留 Visual Basic 代码。这在 Windows 95 上有效,尽管我们现在无法检查。
将来我们将使用 IsWindows7OrGreater
进行额外的 Windows API 调用,在这些情况下我们将提出 LowerThanWindows7Exception
- 我们可以捕获并处理不同的方式(例如使用我们的 Windows XP API 调用来显示错误消息或退回到某些替代功能)。
您可以在 link 时使用 /DELAYLOAD,这样您的应用程序只会在您从 DLL 调用函数时尝试加载 DLL。
如果 Windows 的新版本不可用,您可以从那里使用旧函数打印错误消息。仅举一个明显的例子,MessageBox
从 16 位 Windows 时代就已经存在了。使用它,任何 32 位 Windows 系统回到 Windows 95 and/or Windows NT 3.1 将毫无问题地打印出您的错误消息。 LoadString 是另一个自古以来就存在的东西,因此使用它不会对旧版本的 Windows 造成问题。
基本上,如果他们 运行 在没有安装 Win32s 的纯 16 位 Windows 系统(Windows 3.1 或更早版本)上,它就无法工作,在这种情况下,他们只会收到一条消息说 Windows 无法加载可执行文件。如果还有人 运行宁 16 位 Windows,他们现在可能已经很习惯看到它了。