07年7月份的时候在项目中做了一份操作系统识别的功能。当时是为了针对不同的操作系统实现不同的流程。今天,同样又有这个需求了。但由于,时隔一年有点想不起来了,于是又翻出来“陈年旧账”查找了一下。
实现功能后,觉得还是把一下常用的方法记录下来吧,方便自己的同时也能方便一下正在搜索该方法的朋友。
首先简单了解一下OSVERSIONINFO结构体。在这个结构体中包含了操作系统的主版本号、副版本号等信息。结构定义如下:
typedef struct _OSVERSIONINFO{ DWORDdwOSVersionInfoSize;
DWORDdwMajorVersion;
DWORDdwMinorVersion;
DWORDdwBuildNumber;
DWORDdwPlatformId;
TCHARszCSDVersion[128];
} OSVERSIONINFO;
dwMajorVersion成员是表示操作系统的主版本号,请参考下表。
Value | Meaning |
4 | Windows NT 4.0, Windows Me, Windows 98, Windows 95. |
5 | Windows Server 2003 R2, Windows Server 2003, Windows XP, Windows 2000. |
6 | Windows Vista, Windows Server 2008. |
dwMinorVersion 成员是操作系统的副版本号,请参考下表。
Value | Meaning |
0 | Windows Vista, Windows Server 2008, Windows 2000, Windows NT 4.0, Windows 95. |
1 | Windows XP. |
2 | Windows Server 2003 R2, Windows Server 2003, Windows XP Professional x64 Edition. |
10 | Windows 98. |
90 | Windows Me. |
dwPlatformId 成员是用来识别操作系统,请参考下表。
Value | Meaning |
VER_PLATFORM_WIN32_NT2 | Windows Vista, Windows Server 2008, Windows Server 2003, Windows XP, Windows 2000, Windows NT. |
VER_PLATFORM_WIN32_WINDOWS1 | Windows Me, Windows 98, Windows 95. |
使用上面介绍的这三个成员就可以完成操作系统识别的工作了。
代码:
OSVERSIONINFO versionInfo;
::ZeroMemory(&versionInfo, sizeof(versionInfo));
versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
::GetVersionEx(&versionInfo);
使用GetVersionEx()函数来填充这个结构体,这样我们关心的信息就都找到了,剩下的事情只是做简单的判断。
例如:如何判断是Windows XP 系统
BOOL IsWinXp()
{
if(m_dwPlatformId == VER_PLATFORM_WIN32_NT && (m_dwMajorVersion == 5 && m_dwMinorVersion >= 1))
{
return TRUE;
}
return FALSE;
}
本文只是很肤浅的引子,具体的内容请参看MSDN