我有一个应该在XP及以上版本中运行的Windows应用程序。但Windows的Windows API通常与vista及以上版本不同。我可以检查哪些条件编译标志来确定编译代码的Windows操作系统?如果没有,有没有办法实现这个目标?
我认为它应该是这样的:
void SomeClass::SomeFunction()
{
// Other code
#ifdef WINXP
windowsXPCall();
#else
WindowsCall();
#endif
// Other code
}
答案 0 :(得分:2)
答案取决于编译器和工具链。如果问题是关于Visual C ++,那么你应该将其标记为。
对于VC ++,支持的目标最低操作系统版本由Using the Windows Headers中描述的一组宏控制。
在最简单的情况下,要定位XP,您需要添加
#define _WIN32_WINNT 0x0501
在包含任何Windows标头之前,或将/D_WIN32_WINNT=0x0501
添加到编译器命令行。
如果您不需要支持原始版本的XP(未应用任何服务包),请将0x0501
替换为0x0502
,请参阅同一链接文章中的此说明。
请注意,最新版本的Windows中引入的某些功能可能会添加到以前版本的Windows的Service Pack中。因此,要定位Service Pack,您可能需要使用下一个主要操作系统版本的值定义_WIN32_WINNT。例如,GetDllDirectory函数是在Windows Server 2003中引入的,如果_WIN32_WINNT为0x0502或更高,则会有条件地定义。此功能也已添加到带有SP1的Windows XP中。因此,如果要将_WIN32_WINNT定义为0x0501以定位Windows XP,则会错过Windows XP SP1中定义的功能。
P.S。是你控制自己代码的源代码和编译标志的,所以我不知道如何回答原问题的这一部分。
我可以检查哪些条件编译标志来确定编译代码的Windows操作系统?
答案 1 :(得分:0)
使用一个可执行文件,检测"您目标是什么版本"没有多大意义;您的可执行文件必须针对每个版本。 #ifdef
如上所述无法解决您的问题,除非您构建多个可执行文件(或使用您构建多个版本的帮助程序DLL)。
您的问题可以通过&#34来解决;如何限制winXP可用的API"。 @ dxiv的答案解决了这个问题。