VC中用代码判断Windows的版本

MSDN上有一个表

Operating system Version number dwMajorVersion dwMinorVersion Other Windows 7 6.1 6 1 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION Windows Server 2008 R2 6.1 6 1 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION Windows Server 2008 6.0 6 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION Windows Vista 6.0 6 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION Windows Server 2003 R2 5.2 5 2 GetSystemMetrics(SM_SERVERR2) != 0 Windows Home Server 5.2 5 2 OSVERSIONINFOEX.wSuiteMask == VER_SUITE_WH_SERVER Windows Server 2003 5.2 5 2 GetSystemMetrics(SM_SERVERR2) == 0 Windows XP Professional x64 Edition 5.2 5 2 (OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) && (SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) Windows XP 5.1 5 1 Not applicable Windows 2000 5.0 5 0

Not applicable

贴出代码,在vc2005上通过,在xp,2003上得到证实

  1. // OS.cpp : 定义控制台应用程序的入口点。   
  2. //   
  3. #include "stdafx.h"   
  4. #include <windows.h>   
  5. #include <tchar.h>   
  6. #include <stdio.h>   
  7. #include <strsafe.h>   
  8. #include <stdlib.h>   
  9. #pragma comment(lib, "User32.lib")   
  10. #define BUFSIZE 256   
  11. #define PRODUCT_ULTIMATE                            0x00000001   
  12. #define PRODUCT_HOME_BASIC                          0x00000002   
  13. #define PRODUCT_HOME_PREMIUM                        0x00000003   
  14. #define PRODUCT_ENTERPRISE                          0x00000004   
  15. #define PRODUCT_HOME_BASIC_N                        0x00000005   
  16. #define PRODUCT_BUSINESS                            0x00000006   
  17. #define PRODUCT_STANDARD_SERVER                     0x00000007   
  18. #define PRODUCT_DATACENTER_SERVER                   0x00000008   
  19. #define PRODUCT_SMALLBUSINESS_SERVER                0x00000009   
  20. #define PRODUCT_ENTERPRISE_SERVER                   0x0000000A   
  21. #define PRODUCT_STARTER                             0x0000000B   
  22. #define PRODUCT_DATACENTER_SERVER_CORE              0x0000000C   
  23. #define PRODUCT_STANDARD_SERVER_CORE                0x0000000D   
  24. #define PRODUCT_ENTERPRISE_SERVER_CORE              0x0000000E   
  25. #define PRODUCT_ENTERPRISE_SERVER_IA64              0x0000000F   
  26. #define PRODUCT_BUSINESS_N                          0x00000010   
  27. #define PRODUCT_WEB_SERVER                          0x00000011   
  28. #define PRODUCT_CLUSTER_SERVER                      0x00000012   
  29. #define PRODUCT_HOME_SERVER                         0x00000013   
  30. #define PRODUCT_STORAGE_EXPRESS_SERVER              0x00000014   
  31. #define PRODUCT_STORAGE_STANDARD_SERVER             0x00000015   
  32. #define PRODUCT_STORAGE_WORKGROUP_SERVER            0x00000016   
  33. #define PRODUCT_STORAGE_ENTERPRISE_SERVER           0x00000017   
  34. #define PRODUCT_SERVER_FOR_SMALLBUSINESS            0x00000018   
  35. #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM        0x00000019   
  36. #define PRODUCT_HOME_PREMIUM_N                      0x0000001A   
  37. #define PRODUCT_ENTERPRISE_N                        0x0000001B   
  38. #define PRODUCT_ULTIMATE_N                          0x0000001C   
  39. #define PRODUCT_WEB_SERVER_CORE                     0x0000001D   
  40. #define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT    0x0000001E   
  41. #define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY      0x0000001F   
  42. #define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING     0x00000020   
  43. #define PRODUCT_SMALLBUSINESS_SERVER_PRIME          0x00000021   
  44. #define PRODUCT_HOME_PREMIUM_SERVER                 0x00000022   
  45. #define PRODUCT_SERVER_FOR_SMALLBUSINESS_V          0x00000023   
  46. #define PRODUCT_STANDARD_SERVER_V                   0x00000024   
  47. #define PRODUCT_DATACENTER_SERVER_V                 0x00000025   
  48. #define PRODUCT_ENTERPRISE_SERVER_V                 0x00000026   
  49. #define PRODUCT_DATACENTER_SERVER_CORE_V            0x00000027   
  50. #define PRODUCT_STANDARD_SERVER_CORE_V              0x00000028   
  51. #define PRODUCT_ENTERPRISE_SERVER_CORE_V            0x00000029   
  52. #define PRODUCT_HYPERV                              0x0000002A   
  53. #define SM_TABLETPC             86   
  54. #define SM_MEDIACENTER          87   
  55. #define SM_STARTER              88   
  56. #define SM_SERVERR2             89   
  57. #define VER_SERVER_NT                       0x80000000   
  58. #define VER_WORKSTATION_NT                  0x40000000   
  59. #define VER_SUITE_SMALLBUSINESS             0x00000001   
  60. #define VER_SUITE_ENTERPRISE                0x00000002   
  61. #define VER_SUITE_BACKOFFICE                0x00000004   
  62. #define VER_SUITE_COMMUNICATIONS            0x00000008   
  63. #define VER_SUITE_TERMINAL                  0x00000010   
  64. #define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020   
  65. #define VER_SUITE_EMBEDDEDNT                0x00000040   
  66. #define VER_SUITE_DATACENTER                0x00000080   
  67. #define VER_SUITE_SINGLEUSERTS              0x00000100   
  68. #define VER_SUITE_PERSONAL                  0x00000200   
  69. #define VER_SUITE_BLADE                     0x00000400   
  70. #define VER_SUITE_EMBEDDED_RESTRICTED       0x00000800   
  71. #define VER_SUITE_SECURITY_APPLIANCE        0x00001000   
  72. #define VER_SUITE_STORAGE_SERVER            0x00002000   
  73. #define VER_SUITE_COMPUTE_SERVER            0x00004000   
  74. #define VER_SUITE_WH_SERVER                 0x00008000   
  75.   
  76. typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);   
  77. typedef BOOL (WINAPI *PGPI)(DWORDDWORDDWORDDWORD, PDWORD);   
  78. BOOL GetOSDisplayString( LPTSTR pszOS);   
  79. int _tmain(int argc, _TCHAR* argv[])   
  80. {   
  81. TCHAR szOS[BUFSIZE];   
  82. if( GetOSDisplayString( szOS ) )   
  83.    _tprintf( TEXT("\n%s\n"), szOS );   
  84. system("pause");   
  85. return 0;   
  86. }   
  87. BOOL GetOSDisplayString( LPTSTR pszOS)   
  88. {   
  89. OSVERSIONINFOEX osvi;   
  90. SYSTEM_INFO si;   
  91. PGNSI pGNSI;   
  92. PGPI pGPI;   
  93. BOOL bOsVersionInfoEx;   
  94. DWORD dwType;   
  95. ZeroMemory(&si, sizeof(SYSTEM_INFO));   
  96. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));   
  97. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);   
  98. if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )   
  99.    return 1;   
  100. // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.   
  101. pGNSI = (PGNSI) GetProcAddress(   
  102.    GetModuleHandle(TEXT("kernel32.dll")),    
  103.    "GetNativeSystemInfo");   
  104. if(NULL != pGNSI)   
  105.    pGNSI(&si);   
  106. else GetSystemInfo(&si);   
  107. if ( VER_PLATFORM_WIN32_NT==osvi.dwPlatformId &&    
  108.    osvi.dwMajorVersion > 4 )   
  109. {   
  110.    StringCchCopy(pszOS, BUFSIZE, TEXT("Microsoft "));   
  111.    // Test for the specific product.   
  112.    if ( osvi.dwMajorVersion == 6 )   
  113.    {   
  114.     if( osvi.dwMinorVersion == 0 )   
  115.     {   
  116.      if( osvi.wProductType == VER_NT_WORKSTATION )   
  117.       StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));   
  118.      else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " ));   
  119.     }   
  120.     if ( osvi.dwMinorVersion == 1 )   
  121.     {   
  122.      if( osvi.wProductType == VER_NT_WORKSTATION )   
  123.       StringCchCat(pszOS, BUFSIZE, TEXT("Windows 7 "));   
  124.      else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 R2 " ));   
  125.     }   
  126.     pGPI = (PGPI) GetProcAddress(   
  127.      GetModuleHandle(TEXT("kernel32.dll")),    
  128.      "GetProductInfo");   
  129.     pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);   
  130.     switch( dwType )   
  131.     {   
  132.     case PRODUCT_ULTIMATE:   
  133.      StringCchCat(pszOS, BUFSIZE, TEXT("Ultimate Edition" ));   
  134.      break;   
  135.     case PRODUCT_HOME_PREMIUM:   
  136.      StringCchCat(pszOS, BUFSIZE, TEXT("Home Premium Edition" ));   
  137.      break;   
  138.     case PRODUCT_HOME_BASIC:   
  139.      StringCchCat(pszOS, BUFSIZE, TEXT("Home Basic Edition" ));   
  140.      break;   
  141.     case PRODUCT_ENTERPRISE:   
  142.      StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));   
  143.      break;   
  144.     case PRODUCT_BUSINESS:   
  145.      StringCchCat(pszOS, BUFSIZE, TEXT("Business Edition" ));   
  146.      break;   
  147.     case PRODUCT_STARTER:   
  148.      StringCchCat(pszOS, BUFSIZE, TEXT("Starter Edition" ));   
  149.      break;   
  150.     case PRODUCT_CLUSTER_SERVER:   
  151.      StringCchCat(pszOS, BUFSIZE, TEXT("Cluster Server Edition" ));   
  152.      break;   
  153.     case PRODUCT_DATACENTER_SERVER:   
  154.      StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition" ));   
  155.      break;   
  156.     case PRODUCT_DATACENTER_SERVER_CORE:   
  157.      StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition (core installation)" ));   
  158.      break;   
  159.     case PRODUCT_ENTERPRISE_SERVER:   
  160.      StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));   
  161.      break;   
  162.     case PRODUCT_ENTERPRISE_SERVER_CORE:   
  163.      StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition (core installation)" ));   
  164.      break;   
  165.     case PRODUCT_ENTERPRISE_SERVER_IA64:   
  166.      StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition for Itanium-based Systems" ));   
  167.      break;   
  168.     case PRODUCT_SMALLBUSINESS_SERVER:   
  169.      StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server" ));   
  170.      break;   
  171.     case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:   
  172.      StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server Premium Edition" ));   
  173.      break;   
  174.     case PRODUCT_STANDARD_SERVER:   
  175.      StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition" ));   
  176.      break;   
  177.     case PRODUCT_STANDARD_SERVER_CORE:   
  178.      StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition (core installation)" ));   
  179.      break;   
  180.     case PRODUCT_WEB_SERVER:   
  181.      StringCchCat(pszOS, BUFSIZE, TEXT("Web Server Edition" ));   
  182.      break;   
  183.     }   
  184.    }   
  185.    if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )   
  186.    {   
  187.     if( GetSystemMetrics(SM_SERVERR2) )   
  188.      StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Server 2003 R2, "));   
  189.     else if ( osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER )   
  190.      StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Storage Server 2003"));   
  191.     else if ( osvi.wSuiteMask==VER_SUITE_WH_SERVER )   
  192.      StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Home Server"));   
  193.     else if( osvi.wProductType == VER_NT_WORKSTATION &&   
  194.      si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)   
  195.     {   
  196.      StringCchCat(pszOS, BUFSIZE, TEXT( "Windows XP Professional x64 Edition"));   
  197.     }   
  198.     else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2003, "));   
  199.     // Test for the server type.   
  200.     if ( osvi.wProductType != VER_NT_WORKSTATION )   
  201.     {   
  202.      if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )   
  203.      {   
  204.       if( osvi.wSuiteMask & VER_SUITE_DATACENTER )   
  205.        StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition for Itanium-based Systems" ));   
  206.       else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )   
  207.        StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition for Itanium-based Systems" ));   
  208.      }   
  209.      else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )   
  210.      {   
  211.       if( osvi.wSuiteMask & VER_SUITE_DATACENTER )   
  212.        StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter x64 Edition" ));   
  213.       else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )   
  214.        StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise x64 Edition" ));   
  215.       else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard x64 Edition" ));   
  216.      }   
  217.      else  
  218.      {   
  219.       if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER )   
  220.        StringCchCat(pszOS, BUFSIZE, TEXT( "Compute Cluster Edition" ));   
  221.       else if( osvi.wSuiteMask & VER_SUITE_DATACENTER )   
  222.        StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition" ));   
  223.       else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )   
  224.        StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition" ));   
  225.       else if ( osvi.wSuiteMask & VER_SUITE_BLADE )   
  226.        StringCchCat(pszOS, BUFSIZE, TEXT( "Web Edition" ));   
  227.       else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard Edition" ));   
  228.      }   
  229.     }   
  230.    }   
  231.    if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )   
  232.    {   
  233.     StringCchCat(pszOS, BUFSIZE, TEXT("Windows XP "));   
  234.     if( osvi.wSuiteMask & VER_SUITE_PERSONAL )   
  235.      StringCchCat(pszOS, BUFSIZE, TEXT( "Home Edition" ));   
  236.     else StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));   
  237.    }   
  238.    if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )   
  239.    {   
  240.     StringCchCat(pszOS, BUFSIZE, TEXT("Windows 2000 "));   
  241.     if ( osvi.wProductType == VER_NT_WORKSTATION )   
  242.     {   
  243.      StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));   
  244.     }   
  245.     else    
  246.     {   
  247.      if( osvi.wSuiteMask & VER_SUITE_DATACENTER )   
  248.       StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Server" ));   
  249.      else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )   
  250.       StringCchCat(pszOS, BUFSIZE, TEXT( "Advanced Server" ));   
  251.      else StringCchCat(pszOS, BUFSIZE, TEXT( "Server" ));   
  252.     }   
  253.    }   
  254.    // Include service pack (if any) and build number.   
  255.    if( _tcslen(osvi.szCSDVersion) > 0 )   
  256.    {   
  257.     StringCchCat(pszOS, BUFSIZE, TEXT(" ") );   
  258.     StringCchCat(pszOS, BUFSIZE, osvi.szCSDVersion);   
  259.    }   
  260.    TCHAR buf[80];   
  261.    StringCchPrintf( buf, 80, TEXT(" (build %d)"), osvi.dwBuildNumber);   
  262.    StringCchCat(pszOS, BUFSIZE, buf);   
  263.    if ( osvi.dwMajorVersion >= 6 )   
  264.    {   
  265.     if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )   
  266.      StringCchCat(pszOS, BUFSIZE, TEXT( ", 64-bit" ));   
  267.     else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )   
  268.      StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit"));   
  269.    }   
  270.    return TRUE;    
  271. }   
  272. else  
  273. {    
  274.    printf( "This sample does not support this version of Windows.\n");   
  275.    return FALSE;   
  276. }   
  277. }   
  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓