VC中用代码判断windows的版本

来源:互联网 发布:2017php工程师面试题 编辑:程序博客网 时间:2024/05/18 07:36


VC中用代码判断windows的版本
2009-10-21 11:37
MSDN上有一个表


MSDN上有一个表

Operating systemVersion numberdwMajorVersiondwMinorVersionOtherWindows 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;
}
}