2015-02-24 50 views
0

更新如何正确使用IsWindowsXPOrGreater函数?

我已经重写了原来的问题如前文不是描述我的真正的问题更多的是一个故事:

我们有一组应用程序面向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调用来显示错误消息或下降回到一些替代功能)。

+2

这是太多的文字,但如果任何人使用早于Windows XP的东西,并且您不知道它,那么您可能不应该在乎它们。 – 2015-02-24 07:43:19

+0

我已经阅读了两次,但仍然无法解决你所问的问题。 – 2015-02-24 08:56:57

+0

如果在XP系统之前没有使用过,那么你为什么要检查它? – 2015-02-24 09:35:16

回答

3

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

从那里,如果新版本的Windows不可用,则可以使用旧功能打印出错误消息。只是一个明显的例子,自从16位Windows日子以来,已经有了MessageBox。使用它,任何32位Windows系统回到Windows 95和/或Windows NT 3。1将打印出你的错误信息没有问题。 LoadString是另一种从早期开始就已经存在的功能,因此使用它也不会导致旧版Windows的问题。

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

+0

如果任何* 32.dlls加载失败,我们没有任何问题。你对MessageBox的建议很有帮助,我们可以在VB中挖掘一些遗留代码,看看它是如何在Windows 95机器上使用的。 – camelCase 2015-02-24 19:38:08