2023年12月29日发(作者:)

GetVersionEx获取系统版本信息

最近在windows 8上获取系统版本信息需要调用系统API,于是用到了GetVersionEx。

首先看一看函数原型:

[cpp] view plaincopy

1. BOOL GetVersionEx(POSVERSIONINFO pVersionInformation);

结构OSVERSIONINFOEX定义如下:

[cpp] view plaincopy

1. typedef struct {

2. DWORD dwOSVersionInfoSize; //在使用GetVersionEx之前要将此初始化为结构的大小

3. DWORD dwMajorVersion; //系统主版本号

4. DWORD dwMinorVersion; //系统次版本号

5. DWORD dwBuildNumber; //系统构建号

6. DWORD dwPlatformId; //系统支持的平台

7. TCHAR szCSDVersion[128]; //系统补丁包的名称

8. WORD wServicePackMajor; //系统补丁包的主版本

9. WORD wServicePackMinor; //系统补丁包的次版本

10. WORD wSuiteMask; //标识系统上的程序组

11. BYTE wProductType; //标识系统类型

12. BYTE wReserved; //保留,未使用

13. } OSVERSIONINFOEX, *POSVERSIONINFOEX;

接着在调用函数之前先初始化结构的大小并调用函数,返回true表示成功:

[cpp] view plaincopy

1. OSVERSIONINFOEX os;

2. rsionInfoSize=sizeof(os);

3. if(!GetVersionEx((OSVERSIONINFO *)&os))

4. {

5. return FALSE;

6. }

函数调用成功以后就可以通过OSVERSIONINFOEX来查看系统的版本信息了。

根据微软操作系统编号发现windows 8 对应的windows version

number是6.2

如下:

Operating system Version number

Windows 8 6.2

Windows 7 6.1

Windows Server 2008 R2 6.1

Windows Server 2008 6.0

Windows Vista 6.0

Windows Server 2003 R2 5.2

Windows Server 2003 5.2

Windows XP 5.1

Windows 2000 5.0

下面是一个通过系统版本来判断操作系统名称的例子:

[cpp] view plaincopy

1. CString getSystemName()

2. {

3. SYSTEM_INFO info; //用SYSTEM_INFO结构判断64位AMD处理器

4. GetSystemInfo(&info); //调用GetSystemInfo函数填充结构

5. OSVERSIONINFOEX os;

6. rsionInfoSize=sizeof(OSVERSIONINFOEX);

7. if(GetVersionEx((OSVERSIONINFO *)&os))

8. {

9. CString vname;

10.

11. //下面根据版本信息判断操作系统名称

12. switch(rVersion){ //判断主版本号

13. case 4:

14. switch(rVersion){ //判断次版本号

15. case 0:

16. if(formId==VER_PLATFORM_WIN32_NT)

17. vname=_T("Microsoft Windows NT 4.0"); //1996年7月发布

18. else if(formId==VER_PLATFORM_WIN32_WINDOWS)

19. vname=_T("Microsoft Windows 95");

20. break;

21. case 10:

22. vname=_T("Microsoft Windows 98");

23. break;

24. case 90:

25. vname=_T("Microsoft Windows Me");

26. break;

27. }

28. break;

29. case 5:

30. switch(rVersion){ //dwMinorVersion的值

再比较

31. case 0:

32. vname=_T("Microsoft Windows 2000"); //1999年12月发布

33. break;

34. case 1:

35. vname=_T("Microsoft Windows XP"); //2001年8月发布

36. break;

37. case 2:

38. if(ctType==VER_NT_WORKSTATION &&

39. ssorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)

40. vname=_T("Microsoft Windows XP Professional x64 Edition");

41. else if(GetSystemMetrics(SM_SERVERR2)==0)

42. vname=_T("Microsoft Windows Server 2003"); //2003年3月发布

43. else if(GetSystemMetrics(SM_SERVERR2)!=0)

44. vname=_T("Microsoft Windows Server 2003 R2");

45. break;

46. }

47. break;

48. case 6:

49. switch(rVersion){

50. case 0:

51. if(ctType==VER_NT_WORKSTATION)

52. vname=_T("Microsoft Windows Vista");

53. else

54. vname=_T("Microsoft Windows Server 2008"); //服务器版本

55. break;

56. case 1:

57. if(ctType==VER_NT_WORKSTATION)

58. vname=_T("Microsoft Windows 7");

59. else

60. vname=_T("Microsoft Windows Server 2008 R2");

61. break;

62. case 2:

63. vname=_T("Microsoft Windows 7");

64. break;

65. }

66. break;

67. default:

68. vname=_T("未知操作系统");

69. }

70. return vname;

71. }

72. else

73. return _T("");

74. }

以上只能判断操作系统的名称,那如何判断它是什么版本的呢(如Home版或Professional版)。

下面这个函数就返回具体的版本名称:

[cpp] view plaincopy

1. CString getVersionMark()

2. {

3. OSVERSIONINFOEX os;

4. rsionInfoSize=sizeof(OSVERSIONINFOEX);

5. if(GetVersionEx((OSVERSIONINFO *)&os)){

6. CString vmark;

7.

8. switch(rVersion){ //先判断操作系统版本

9. case 5:

10. switch(rVersion){

11. case 0: //Windows 2000

12. if(Mask==VER_SUITE_ENTERPRISE)

13. vmark=_T("Advanced Server");

14. break;

15. case 1: //Windows XP

16. if(Mask==VER_SUITE_EMBEDDEDNT)

17. vmark=_T("Embedded");

18. else if(Mask==VER_SUITE_PERSONAL)

19. vmark=_T("Home Edition");

20. else

21. vmark=_T("Professional");

22. break;

23. case 2:

24. if(GetSystemMetrics(SM_SERVERR2)==0 && /

25.

26. Mask==VER_SUITE_BLADE) //Windows Server 2003

27. vmark=_T("Web Edition");

28. else if(GetSystemMetrics(SM_SERVERR2)==0 &&

29. Mask==VER_SUITE_COMPUTE_SERVER)

30. vmark=_T("Compute Cluster Edition");

31. else if(GetSystemMetrics(SM_SERVERR2)==0 &&

32. Mask==VER_SUITE_STORAGE_SERVER)

33. vmark=_T("Storage Server");

34. else if(GetSystemMetrics(SM_SERVERR2)==0 &&

35. Mask==VER_SUITE_DATACENTER)

36. vmark=_T("Datacenter Edition");

37. else if(GetSystemMetrics(SM_SERVERR2)==0 &&

38. Mask==VER_SUITE_ENTERPRISE)

39. vmark=_T("Enterprise Edition");

40. else if(GetSystemMetrics(SM_SERVERR2)!=0 &&

41. Mask==VER_SUITE_STORAGE_SERVER)

42. vmark=_T("Storage Server");

43. break;

44. }

45. break;

46. case 6:

47. switch(rVersion){

48. case 0:

49. if(ctType!=VER_NT_WORKSTATION &&

50. Mask==VER_SUITE_DATACENTER)

51. vmark=_T("Datacenter Server");

52. else if(ctType!=VER_NT_WORKSTATION &&

53. Mask==VER_SUITE_ENTERPRISE)

54. vmark=_T("Enterprise");

55. else if(ctType==VER_NT_WORKSTATION &&

56. Mask==VER_SUITE_PERSONAL) //Windows

Vista

57. vmark=_T("Home");

58. break;

59. }

60. break;

61. default:

62. vmark=_T("");

63. }

64. return vmark;

65. }

66. else

67. return _T("");

68. }

另外,操作系统的补丁包名称也可以从szCSDVersion直接获取。

FYI