VC中用代码判断windows的版本

    技术2022-05-20  33

     

    MSDN上有一个表

    Operating systemVersion numberdwMajorVersion dwMinorVersion OtherWindows 76.161OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATIONWindows Server 2008 R26.161OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATIONWindows Server 20086.060OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATIONWindows Vista6.060OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATIONWindows Server 2003 R25.252GetSystemMetrics(SM_SERVERR2) != 0Windows Home Server5.252OSVERSIONINFOEX.wSuiteMask == VER_SUITE_WH_SERVERWindows Server 20035.252GetSystemMetrics(SM_SERVERR2) == 0Windows XP Professional x64 Edition5.252(OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) && (SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)Windows XP5.151Not applicableWindows 20005.050

    Not applicable

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

    // OS.cpp : 定义控制台应用程序的入口点。 //

    #include "stdafx.h"

    #include <windows.h> #include <tchar.h> #include <stdio.h> #include <strsafe.h> #include <stdlib.h>

    #pragma comment(lib, "User32.lib")

    #define BUFSIZE 256

    #define PRODUCT_ULTIMATE                            0x00000001

    #define PRODUCT_HOME_BASIC                          0x00000002 #define PRODUCT_HOME_PREMIUM                        0x00000003 #define PRODUCT_ENTERPRISE                          0x00000004 #define PRODUCT_HOME_BASIC_N                        0x00000005 #define PRODUCT_BUSINESS                            0x00000006 #define PRODUCT_STANDARD_SERVER                     0x00000007 #define PRODUCT_DATACENTER_SERVER                   0x00000008 #define PRODUCT_SMALLBUSINESS_SERVER                0x00000009 #define PRODUCT_ENTERPRISE_SERVER                   0x0000000A #define PRODUCT_STARTER                             0x0000000B #define PRODUCT_DATACENTER_SERVER_CORE              0x0000000C #define PRODUCT_STANDARD_SERVER_CORE                0x0000000D #define PRODUCT_ENTERPRISE_SERVER_CORE              0x0000000E #define PRODUCT_ENTERPRISE_SERVER_IA64              0x0000000F #define PRODUCT_BUSINESS_N                          0x00000010 #define PRODUCT_WEB_SERVER                          0x00000011 #define PRODUCT_CLUSTER_SERVER                      0x00000012 #define PRODUCT_HOME_SERVER                         0x00000013 #define PRODUCT_STORAGE_EXPRESS_SERVER              0x00000014 #define PRODUCT_STORAGE_STANDARD_SERVER             0x00000015

    #define PRODUCT_STORAGE_WORKGROUP_SERVER            0x00000016 #define PRODUCT_STORAGE_ENTERPRISE_SERVER           0x00000017 #define PRODUCT_SERVER_FOR_SMALLBUSINESS            0x00000018 #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM        0x00000019 #define PRODUCT_HOME_PREMIUM_N                      0x0000001A #define PRODUCT_ENTERPRISE_N                        0x0000001B #define PRODUCT_ULTIMATE_N                          0x0000001C #define PRODUCT_WEB_SERVER_CORE                     0x0000001D #define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT    0x0000001E #define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY      0x0000001F #define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING     0x00000020 #define PRODUCT_SMALLBUSINESS_SERVER_PRIME          0x00000021 #define PRODUCT_HOME_PREMIUM_SERVER                 0x00000022 #define PRODUCT_SERVER_FOR_SMALLBUSINESS_V          0x00000023 #define PRODUCT_STANDARD_SERVER_V                   0x00000024 #define PRODUCT_DATACENTER_SERVER_V                 0x00000025 #define PRODUCT_ENTERPRISE_SERVER_V                 0x00000026 #define PRODUCT_DATACENTER_SERVER_CORE_V            0x00000027 #define PRODUCT_STANDARD_SERVER_CORE_V              0x00000028 #define PRODUCT_ENTERPRISE_SERVER_CORE_V            0x00000029 #define PRODUCT_HYPERV                              0x0000002A #define SM_TABLETPC             86 #define SM_MEDIACENTER          87 #define SM_STARTER              88 #define SM_SERVERR2             89 #define VER_SERVER_NT                       0x80000000 #define VER_WORKSTATION_NT                  0x40000000 #define VER_SUITE_SMALLBUSINESS             0x00000001 #define VER_SUITE_ENTERPRISE                0x00000002 #define VER_SUITE_BACKOFFICE                0x00000004 #define VER_SUITE_COMMUNICATIONS            0x00000008 #define VER_SUITE_TERMINAL                  0x00000010 #define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020 #define VER_SUITE_EMBEDDEDNT                0x00000040 #define VER_SUITE_DATACENTER                0x00000080 #define VER_SUITE_SINGLEUSERTS              0x00000100 #define VER_SUITE_PERSONAL                  0x00000200 #define VER_SUITE_BLADE                     0x00000400 #define VER_SUITE_EMBEDDED_RESTRICTED       0x00000800 #define VER_SUITE_SECURITY_APPLIANCE        0x00001000 #define VER_SUITE_STORAGE_SERVER            0x00002000 #define VER_SUITE_COMPUTE_SERVER            0x00004000 #define VER_SUITE_WH_SERVER                 0x00008000

    typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);

    BOOL GetOSDisplayString( LPTSTR pszOS);

    int _tmain(int argc, _TCHAR* argv[]) { TCHAR szOS[BUFSIZE];

    if( GetOSDisplayString( szOS ) )    _tprintf( TEXT("/n%s/n"), szOS ); system("pause"); return 0; }

    BOOL GetOSDisplayString( LPTSTR pszOS) { OSVERSIONINFOEX osvi; SYSTEM_INFO si; PGNSI pGNSI; PGPI pGPI; BOOL bOsVersionInfoEx; DWORD dwType;

    ZeroMemory(&si, sizeof(SYSTEM_INFO)); ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));

    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

    if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )    return 1;

    // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.

    pGNSI = (PGNSI) GetProcAddress(    GetModuleHandle(TEXT("kernel32.dll")),    "GetNativeSystemInfo"); if(NULL != pGNSI)    pGNSI(&si); else GetSystemInfo(&si);

    if ( VER_PLATFORM_WIN32_NT==osvi.dwPlatformId &&    osvi.dwMajorVersion > 4 ) {    StringCchCopy(pszOS, BUFSIZE, TEXT("Microsoft "));

       // Test for the specific product.

       if ( osvi.dwMajorVersion == 6 )    {     if( osvi.dwMinorVersion == 0 )     {      if( osvi.wProductType == VER_NT_WORKSTATION )       StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));      else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " ));     }

        if ( osvi.dwMinorVersion == 1 )     {      if( osvi.wProductType == VER_NT_WORKSTATION )       StringCchCat(pszOS, BUFSIZE, TEXT("Windows 7 "));      else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 R2 " ));     }

        pGPI = (PGPI) GetProcAddress(      GetModuleHandle(TEXT("kernel32.dll")),      "GetProductInfo");

        pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);

        switch( dwType )     {     case PRODUCT_ULTIMATE:      StringCchCat(pszOS, BUFSIZE, TEXT("Ultimate Edition" ));      break;     case PRODUCT_HOME_PREMIUM:      StringCchCat(pszOS, BUFSIZE, TEXT("Home Premium Edition" ));      break;     case PRODUCT_HOME_BASIC:      StringCchCat(pszOS, BUFSIZE, TEXT("Home Basic Edition" ));      break;     case PRODUCT_ENTERPRISE:      StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));      break;     case PRODUCT_BUSINESS:      StringCchCat(pszOS, BUFSIZE, TEXT("Business Edition" ));      break;     case PRODUCT_STARTER:      StringCchCat(pszOS, BUFSIZE, TEXT("Starter Edition" ));      break;     case PRODUCT_CLUSTER_SERVER:      StringCchCat(pszOS, BUFSIZE, TEXT("Cluster Server Edition" ));      break;     case PRODUCT_DATACENTER_SERVER:      StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition" ));      break;     case PRODUCT_DATACENTER_SERVER_CORE:      StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition (core installation)" ));      break;     case PRODUCT_ENTERPRISE_SERVER:      StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));      break;     case PRODUCT_ENTERPRISE_SERVER_CORE:      StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition (core installation)" ));      break;     case PRODUCT_ENTERPRISE_SERVER_IA64:      StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition for Itanium-based Systems" ));      break;     case PRODUCT_SMALLBUSINESS_SERVER:      StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server" ));      break;     case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:      StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server Premium Edition" ));      break;     case PRODUCT_STANDARD_SERVER:      StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition" ));      break;     case PRODUCT_STANDARD_SERVER_CORE:      StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition (core installation)" ));      break;     case PRODUCT_WEB_SERVER:      StringCchCat(pszOS, BUFSIZE, TEXT("Web Server Edition" ));      break;     }    }

       if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )    {     if( GetSystemMetrics(SM_SERVERR2) )      StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Server 2003 R2, "));     else if ( osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER )      StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Storage Server 2003"));     else if ( osvi.wSuiteMask==VER_SUITE_WH_SERVER )      StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Home Server"));     else if( osvi.wProductType == VER_NT_WORKSTATION &&      si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)     {      StringCchCat(pszOS, BUFSIZE, TEXT( "Windows XP Professional x64 Edition"));     }     else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2003, "));

        // Test for the server type.     if ( osvi.wProductType != VER_NT_WORKSTATION )     {      if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )      {       if( osvi.wSuiteMask & VER_SUITE_DATACENTER )        StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition for Itanium-based Systems" ));       else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )        StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition for Itanium-based Systems" ));      }

         else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )      {       if( osvi.wSuiteMask & VER_SUITE_DATACENTER )        StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter x64 Edition" ));       else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )        StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise x64 Edition" ));       else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard x64 Edition" ));      }

         else      {       if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER )        StringCchCat(pszOS, BUFSIZE, TEXT( "Compute Cluster Edition" ));       else if( osvi.wSuiteMask & VER_SUITE_DATACENTER )        StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition" ));       else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )        StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition" ));       else if ( osvi.wSuiteMask & VER_SUITE_BLADE )        StringCchCat(pszOS, BUFSIZE, TEXT( "Web Edition" ));       else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard Edition" ));      }     }    }

       if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )    {     StringCchCat(pszOS, BUFSIZE, TEXT("Windows XP "));     if( osvi.wSuiteMask & VER_SUITE_PERSONAL )      StringCchCat(pszOS, BUFSIZE, TEXT( "Home Edition" ));     else StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));    }

       if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )    {     StringCchCat(pszOS, BUFSIZE, TEXT("Windows 2000 "));

        if ( osvi.wProductType == VER_NT_WORKSTATION )     {      StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));     }     else     {      if( osvi.wSuiteMask & VER_SUITE_DATACENTER )       StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Server" ));      else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )       StringCchCat(pszOS, BUFSIZE, TEXT( "Advanced Server" ));      else StringCchCat(pszOS, BUFSIZE, TEXT( "Server" ));     }    }

       // Include service pack (if any) and build number.

       if( _tcslen(osvi.szCSDVersion) > 0 )    {     StringCchCat(pszOS, BUFSIZE, TEXT(" ") );     StringCchCat(pszOS, BUFSIZE, osvi.szCSDVersion);    }

       TCHAR buf[80];

       StringCchPrintf( buf, 80, TEXT(" (build %d)"), osvi.dwBuildNumber);    StringCchCat(pszOS, BUFSIZE, buf);

       if ( osvi.dwMajorVersion >= 6 )    {     if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )      StringCchCat(pszOS, BUFSIZE, TEXT( ", 64-bit" ));     else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )      StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit"));    }

       return TRUE; }

    else {    printf( "This sample does not support this version of Windows./n");    return FALSE; } }

     


    最新回复(0)