更好的版本检查
识别当前操作系统版本并不是一个确定某些操作系统特性是否存在的最好方法。但是,如果你的应用程序无法检查某项特性是否存在,唯一的办法就是通过版本检查来确定应用程序的兼容性。当你确定要进行版本检查的时候,可以考虑下面的实例代码。
对于非托管代码的应用程序,你必须确保你的版本检查能够应对更新版本的Windows操作系统。请一定记住:不能阻止版本变化!在下面这段代码中,我们使用了GetVersionEx来获取操作系统的版本。如果主版本号大于5(包括Windows Vista,Windows Server 2008 R2和Windows 7),版本检查将通过,如果等于5,那么次版本号应该大于或者等于1(包括Windows XP,Windows Server 2003)。
#include <windows.h>
#include <stdio.h>
void main()
{
OSVERSIONINFO osvi;
BOOL bIsWindowsXPorLater;
// 初始化OSVERSIONINFO结构体
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
// 获得当前操作系统版本
GetVersionEx(&osvi);
// 通过版本号,判断是否是XP及其以后的操作系统
bIsWindowsXPorLater =
( (osvi.dwMajorVersion > 5) ||
( (osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion >= 1) ));
if(bIsWindowsXPorLater)
printf("当前系统满足要求.\n");
else printf("当前系统不满足要求.\n");
}
#include <stdio.h>
void main()
{
OSVERSIONINFO osvi;
BOOL bIsWindowsXPorLater;
// 初始化OSVERSIONINFO结构体
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
// 获得当前操作系统版本
GetVersionEx(&osvi);
// 通过版本号,判断是否是XP及其以后的操作系统
bIsWindowsXPorLater =
( (osvi.dwMajorVersion > 5) ||
( (osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion >= 1) ));
if(bIsWindowsXPorLater)
printf("当前系统满足要求.\n");
else printf("当前系统不满足要求.\n");
}
在非托管代码中,我们还可以使用VerifyVersionInfo来检查操作系统版本,以实现对操作系统版本的最小要求(Windows XP SP2)。例如:
#include <windows.h>
// 检查操作系统最小版本需求
// 如果当前的操作系统版本在Windows XP SP2或者以后(例如,Windows Vista, Windows 7),
// 这个函数就返回TRUE
BOOL TestMinimumOSRequirement() {
OSVERSIONINFOEX osvi;
// 初始化OSVERSIONINFOEX结构体.
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osvi.dwMajorVersion = 5;
osvi.dwMinorVersion = 1; // Windows XP
osvi.wServicePackMajor = 2; // Service Pack 2
osvi.wServicePackMinor = 0;
// 初始化比较条件
// ULONGLONG VER_SET_CONDITION(ULONGLONG dwlConditionMask,
// DWORD dwTypeBitMask, BYTE dwConditionMask)
ULONGLONG comparisoninformation = 0;
BYTE conditionMask = VER_GREATER_EQUAL; // 需要大于或者等于,这里可以根据需要灵活设置
VER_SET_CONDITION(comparisoninformation, VER_MAJORVERSION, conditionMask);
VER_SET_CONDITION(comparisoninformation, VER_MINORVERSION, conditionMask);
VER_SET_CONDITION(comparisoninformation, VER_SERVICEPACKMAJOR, conditionMask);
VER_SET_CONDITION(comparisoninformation, VER_SERVICEPACKMINOR, conditionMask);
// 进行版本比较
return VerifyVersionInfo( &osvi,
VER_MAJORVERSION | VER_MINORVERSION |
VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
comparisoninformation);
}
// 检查操作系统最小版本需求
// 如果当前的操作系统版本在Windows XP SP2或者以后(例如,Windows Vista, Windows 7),
// 这个函数就返回TRUE
BOOL TestMinimumOSRequirement() {
OSVERSIONINFOEX osvi;
// 初始化OSVERSIONINFOEX结构体.
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osvi.dwMajorVersion = 5;
osvi.dwMinorVersion = 1; // Windows XP
osvi.wServicePackMajor = 2; // Service Pack 2
osvi.wServicePackMinor = 0;
// 初始化比较条件
// ULONGLONG VER_SET_CONDITION(ULONGLONG dwlConditionMask,
// DWORD dwTypeBitMask, BYTE dwConditionMask)
ULONGLONG comparisoninformation = 0;
BYTE conditionMask = VER_GREATER_EQUAL; // 需要大于或者等于,这里可以根据需要灵活设置
VER_SET_CONDITION(comparisoninformation, VER_MAJORVERSION, conditionMask);
VER_SET_CONDITION(comparisoninformation, VER_MINORVERSION, conditionMask);
VER_SET_CONDITION(comparisoninformation, VER_SERVICEPACKMAJOR, conditionMask);
VER_SET_CONDITION(comparisoninformation, VER_SERVICEPACKMINOR, conditionMask);
// 进行版本比较
return VerifyVersionInfo( &osvi,
VER_MAJORVERSION | VER_MINORVERSION |
VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
comparisoninformation);
}
相对于非托管代码,托管代码的版本检查就简单的多了。我们可以使用Version对象的==, !=, <=, <, >, >=操作符来跟Environment.OSVersion.Version对象进行比较,以执行正确的版本检查。例如:
static void Main()
{
// 这段代码将检查当前系统是否是Windows XP或之后的操作系统
if (Environment.OSVersion.Version < new Version(5, 1))
{
MessageBox.Show("本应用程序需要运行在Windows XP或以后的操作系统.",
"不兼容的操作系统", MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
// 符合版本要求,继续运行
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
{
// 这段代码将检查当前系统是否是Windows XP或之后的操作系统
if (Environment.OSVersion.Version < new Version(5, 1))
{
MessageBox.Show("本应用程序需要运行在Windows XP或以后的操作系统.",
"不兼容的操作系统", MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
// 符合版本要求,继续运行
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}