VC中用代码判断windows的版本

 

MSDN上有一个表

Operating systemVersion numberdwMajorVersion dwMinorVersion Other
Windows 76.161OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2008 R26.161OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Server 20086.060OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Vista6.060OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2003 R25.252GetSystemMetrics(SM_SERVERR2) != 0
Windows Home Server5.252OSVERSIONINFOEX.wSuiteMask == VER_SUITE_WH_SERVER
Windows Server 20035.252GetSystemMetrics(SM_SERVERR2) == 0
Windows XP Professional x64 Edition5.252(OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) && (SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
Windows XP5.151Not applicable
Windows 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值