最近遇到一些朋友问我关于系统版本的问题。其实就我个人来说,我觉得大家都是一个互相学习的过程。所以这个问题我觉得略微讨论下也无妨。我这次想从C/C++这个层面上来简单跟大家分享一下系统版本这个问题。
一般来说我们对于系统版本我们采用GetVersion Windows API去做。它的函数签名如下:
当然这个方法后来被GetVersionEx function以及VerifyVersionInfo function所取代。我们下面具体看下这两个方法。
首先是GetVersionEx。它的函数原型是:
__inout LPOSVERSIONINFOA lpVersionInformation
);
BOOL GetVersionExW(
__inout LPOSVERSIONINFOW lpVersionInformation
);
我们也会发现这里面氛围了ANSI和UNICODE两类。我们会发现这个方法传入了POSVERSIONINFOEX这个结构的指针。那么这个结构的具体内容我们在这里查看到。这个结构自从windows 2000的时候就开始沿用,当然其他版本的一些windows使用的是一个比较老的结构,例如servicepack,suitemask等信息是不被包含的。
当然我们为了让这件事情变得简单,在windows vista里面,我们提供了VerifyVersionInfo的方法。它的函数原型是:
__inout LPOSVERSIONINFOEXA lpVersionInformation,
__in DWORD dwTypeMask,
__in DWORDLONG dwlConditionMask
);
BOOL VerifyVersionInfoW(
__inout LPOSVERSIONINFOEXW lpVersionInformation,
__in DWORD dwTypeMask,
__in DWORDLONG dwlConditionMask
);
对于这个方法,我们需要去分配一个内存空间给OSVERSIONINFOEX用来初始化dwOSVersionInfoSize。当我们在调用VerifyVersionInfo方法的时候,dwTypeMask参数就用来指出哪些成员我们已经被初始化。当然这个参数的标记类型有很多。比如说:VER_MINORVERSION等。那么对于最后这个64位长度的值,就是用来控制这个方法如何与系统版本系统进行比较来得到你所想要的信息。
那么我们这里就简单写一个例子来判别当前系统是不是Windows 7。在这里我还是想提一下windows的error handing。一般而言,VerifyVersionInfo方法会返回一个非0值,也就是说我们的检测是成功的。当然也会遇到检测不成功的情况,可能是系统信息不匹配或者是方法调用时候出现问题。所以我建议大家可以使用GetLastError方法去检查他的错误返回码,如果是返回ERROR_OLD_WIN_VERSION,那么说明我们调用VerifyVersionInfo方法是正确的,只是我们的操作系统版本不匹配。
#include < strsafe.h >
#include < Windows.h >
int _tmain( int argc, _TCHAR * argv[])
{
OSVERSIONINFOEX osver = { 0 };
osver.dwOSVersionInfoSize = sizeof (osver);
osver.dwMajorVersion = 6 ;
osver.dwMinorVersion = 1 ;
osver.dwPlatformId = VER_PLATFORM_WIN32_NT; // http://msdn.microsoft.com/en-us/library/ms724833 (VS.85).aspx
DWORDLONG dwlConditionMask = 0 ;
VER_SET_CONDITION(dwlConditionMask,VER_MAJORVERSION,VER_EQUAL);
VER_SET_CONDITION(dwlConditionMask,VER_MINORVERSION,VER_EQUAL);
VER_SET_CONDITION(dwlConditionMask,VER_PLATFORMID,VER_EQUAL);
if (VerifyVersionInfo( & osver,VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID,dwlConditionMask))
{
_tprintf(TEXT( " EQUAL " ));
} else
{
_tprintf(TEXT( " NON-EQUAL " ));
}
return 0 ;
}
希望对大家有些许帮助。
=====我=======是========结========束=========线===========