在判断电脑系统前,我们先要知道版本号,通过函数调用返回的信息,就可以知道是什么系统。

    下面这图是官方提供的关于 Windows 版本对应的号码

    C/C++判断操作系统(Win10,Win8.1WinServer等等)-完整源码及思路 - 图1

    我们可以通过系统 Windows 的 API 中 GetVersionEx 这个函数获取 win8.1 下的版本。

    (这里我只稍微解释下,win8.1 以上的版本用 GetVersionEx 将获取不了,要用别的方法,待会将会说明)

    因为本人没有 winServer2016 的系统,所以在下面和代码里面将不会演示获取 winServer2016。

    用 win10 为例,该如何获取 win10

    RtlGetNtVersionNumbers 法

    1. typedef void (__stdcall*NTPROC)(DWORD*,DWORD*,DWORD*);
    2. void GetWinVer()
    3. {
    4. HINSTANCE hinst = LoadLibrary("ntdll.dll");
    5. DWORD dwMajor,dwMinor,dwBuildNumber;
    6. NTPROC proc = (NTPROC)GetProcAddress(hinst,"RtlGetNtVersionNumbers"); proc(&dwMajor,&dwMinor,&dwBuildNumber);
    7. }

    这个方法可以准备分辨出 win8.1 的 6.3 系统号。

    那么 win8.1 以下的版本呢?

    我们调用 GetVersionEx 这个函数获取。

    下面给出代码,因为有注释,在此就不再说明,逻辑思路如刚刚所说:

    1. #include <Windows.h>
    2. #include <string>
    3. #include <stdio.h>
    4. void getSystemName()
    5. {
    6. std::string vname;
    7. //先判断是否为win8.1或win10
    8. typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*);
    9. HINSTANCE hinst = LoadLibrary("ntdll.dll");
    10. DWORD dwMajor, dwMinor, dwBuildNumber;
    11. NTPROC proc = (NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers");
    12. proc(&dwMajor, &dwMinor, &dwBuildNumber);
    13. if (dwMajor == 6 && dwMinor == 3) //win 8.1
    14. {
    15. vname = "Microsoft Windows 8.1";
    16. printf_s("此电脑的版本为:%s\n", vname.c_str());
    17. return;
    18. }
    19. if (dwMajor == 10 && dwMinor == 0) //win 10
    20. {
    21. vname = "Microsoft Windows 10";
    22. printf_s("此电脑的版本为:%s\n", vname.c_str());
    23. return;
    24. }
    25. //下面判断不能Win Server,因为本人还未有这种系统的机子,暂时不给出
    26. //判断win8.1以下的版本
    27. SYSTEM_INFO info; //用SYSTEM_INFO结构判断64位AMD处理器
    28. GetSystemInfo(&info); //调用GetSystemInfo函数填充结构
    29. OSVERSIONINFOEX os;
    30. os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    31. #pragma warning(disable:4996)
    32. if (GetVersionEx((OSVERSIONINFO *)&os))
    33. {
    34. //下面根据版本信息判断操作系统名称
    35. switch (os.dwMajorVersion)
    36. { //判断主版本号
    37. case 4:
    38. switch (os.dwMinorVersion)
    39. { //判断次版本号
    40. case 0:
    41. if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
    42. vname ="Microsoft Windows NT 4.0"; //1996年7月发布
    43. else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
    44. vname = "Microsoft Windows 95";
    45. break;
    46. case 10:
    47. vname ="Microsoft Windows 98";
    48. break;
    49. case 90:
    50. vname = "Microsoft Windows Me";
    51. break;
    52. }
    53. break;
    54. case 5:
    55. switch (os.dwMinorVersion)
    56. { //再比较dwMinorVersion的值
    57. case 0:
    58. vname = "Microsoft Windows 2000"; //1999年12月发布
    59. break;
    60. case 1:
    61. vname = "Microsoft Windows XP"; //2001年8月发布
    62. break;
    63. case 2:
    64. if (os.wProductType == VER_NT_WORKSTATION &&
    65. info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
    66. vname = "Microsoft Windows XP Professional x64 Edition";
    67. else if (GetSystemMetrics(SM_SERVERR2) == 0)
    68. vname = "Microsoft Windows Server 2003"; //2003年3月发布
    69. else if (GetSystemMetrics(SM_SERVERR2) != 0)
    70. vname = "Microsoft Windows Server 2003 R2";
    71. break;
    72. }
    73. break;
    74. case 6:
    75. switch (os.dwMinorVersion)
    76. {
    77. case 0:
    78. if (os.wProductType == VER_NT_WORKSTATION)
    79. vname = "Microsoft Windows Vista";
    80. else
    81. vname = "Microsoft Windows Server 2008"; //服务器版本
    82. break;
    83. case 1:
    84. if (os.wProductType == VER_NT_WORKSTATION)
    85. vname = "Microsoft Windows 7";
    86. else
    87. vname = "Microsoft Windows Server 2008 R2";
    88. break;
    89. case 2:
    90. if (os.wProductType == VER_NT_WORKSTATION)
    91. vname = "Microsoft Windows 8";
    92. else
    93. vname = "Microsoft Windows Server 2012";
    94. break;
    95. }
    96. break;
    97. default:
    98. vname = "未知操作系统";
    99. }
    100. printf_s("此电脑的版本为:%s\n", vname.c_str());
    101. }
    102. else
    103. printf_s("版本获取失败\n");
    104. }
    105. void main()
    106. {
    107. getSystemName();
    108. system("pause");
    109. }

    下面是几台电脑的运行结果:

    首先是大家关注的 win10

    C/C++判断操作系统(Win10,Win8.1WinServer等等)-完整源码及思路 - 图2

    然后是 win server2008R2

    C/C++判断操作系统(Win10,Win8.1WinServer等等)-完整源码及思路 - 图3

    然后是 win7

    C/C++判断操作系统(Win10,Win8.1WinServer等等)-完整源码及思路 - 图4

    xp 系统

    C/C++判断操作系统(Win10,Win8.1WinServer等等)-完整源码及思路 - 图5
    https://it1995.blog.csdn.net/article/details/64440535?spm=1001.2101.3001.6650.5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5-64440535-blog-49912221.pc_relevant_multi_platform_whitelistv2_ad_hc