更新
我重写了原来的问题,因为之前的文字更像是一个故事,而不是描述我的真实问题:
我们有一组应用程序,目标是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调用)显示错误消息或退回某些替代功能。)
答案 0 :(得分:3)
链接时可以使用/DELAYLOAD,这样当您从该DLL调用函数时,您的应用程序将只尝试加载DLL。
从那里,如果没有足够新的Windows版本,您可以使用旧功能打印出错误消息。仅举一个明显的例子,MessageBox
自16位Windows时代以来一直存在。使用它,任何32位Windows系统返回到Windows 95和/或Windows NT 3.1将打印出您的错误消息没有问题。 LoadString是另一个自时间开始以来一直存在的东西,因此使用它不会导致旧版本Windows出现问题。
基本上,它不能工作的唯一方法是,如果他们在没有安装Win32s的纯16位Windows系统(Windows 3.1或更早版本)上运行它,在这种情况下,他们只会得到它一条消息说Windows无法加载可执行文件。如果有人还在运行16位Windows,那么他们现在可能已经习以为常了。