现在的位置: 首页 > 综合 > 正文

VC中用代码判断windows的版本

2013年08月01日 ⁄ 综合 ⁄ 共 11136字 ⁄ 字号 评论关闭

 

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上得到证实

// 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;
}
}

 

抱歉!评论已关闭.