获取Windows版本信息

在google里搜索“msdn os version”及“获取Windows版本”可得到大量的资料,以下代码就是从网上搜集的资料整理而成(代码在VC++ 2005及VC++ 2005 Express中编译通过):

/*****************************************************************************
Operating System             Version     PlatformID
Windows 8                    6.2         VER_PLATFORM_WIN32_NT (=2)
Windows 7                    6.1         VER_PLATFORM_WIN32_NT
Windows Server 2008 R2       6.1         VER_PLATFORM_WIN32_NT
Windows Server 2008          6.0         VER_PLATFORM_WIN32_NT
Windows Vista                6.0         VER_PLATFORM_WIN32_NT
Windows Server 2003 R2       5.2         VER_PLATFORM_WIN32_NT
Windows Server 2003          5.2         VER_PLATFORM_WIN32_NT
Windows XP 64-Bit Edition    5.2         VER_PLATFORM_WIN32_NT
Windows XP                   5.1         VER_PLATFORM_WIN32_NT
Windows 2000                 5.0         VER_PLATFORM_WIN32_NT
Windows NT 4.0               4.0         VER_PLATFORM_WIN32_NT
Windows NT 3.51              3.51 ?      VER_PLATFORM_WIN32_NT
Windows Millennium Edition   4.90        VER_PLATFORM_WIN32_WINDOWS (=1)
Windows 98                   4.10        VER_PLATFORM_WIN32_WINDOWS
Windows 95                   4.0         VER_PLATFORM_WIN32_WINDOWS
Windows 3.1                  3.1 ?       VER_PLATFORM_WIN32s (=0)
*****************************************************************************/

//#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
//#include <stdio.h>
#include <strsafe.h>

#pragma comment(lib, "User32.lib")
#pragma comment(lib, "Advapi32.lib")  //VS2005 Express needed

#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 PRODUCT_PROFESSIONAL                        0x00000030

#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)
{
   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);
   bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi);

   if(!bOsVersionInfoEx) return FALSE;

   // 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.dwMajorVersion > 6 || osvi.dwMinorVersion > 2 )
    {
     StringCchCat(pszOS, BUFSIZE, TEXT("Windows 8 Later "));  // for new OS
    }
          else if( osvi.dwMinorVersion == 0 )
          {
            if( osvi.wProductType == VER_NT_WORKSTATION )
                StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));
            else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " ));
          }
          else 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 " ));
          }
    else if ( osvi.dwMinorVersion == 2 )
    {
    StringCchCat(pszOS, BUFSIZE, TEXT("Windows 8 "));
    }
         
         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_PROFESSIONAL:
               StringCchCat(pszOS, BUFSIZE, TEXT("Professional" ));
               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;
         }
      }

      else 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" ));
            }
         }
      }

      else 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" ));
      }

      else 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
   {  
      return FALSE;
   }
}

BOOL GetOldOSVer(LPSTR pszOldOS)
{
 OSVERSIONINFOEXA osvi;
 BOOL bOsVersionInfoEx;

 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEXA));

 // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
 // If that fails, try using the OSVERSIONINFO structure.
 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
 bOsVersionInfoEx = GetVersionExA ((OSVERSIONINFOA *) &osvi);

 if( !bOsVersionInfoEx )
 {
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
  if (! GetVersionExA ( (OSVERSIONINFOA *) &osvi) )
  {
   StringCchCatA(pszOldOS, BUFSIZE, "Unknow Windows?");
   return FALSE;
  }
 }

 switch (osvi.dwPlatformId)
 {
  // Test for the Windows NT product family.
  case VER_PLATFORM_WIN32_NT:
   if (osvi.dwMajorVersion <= 4){
    StringCchCatA(pszOldOS, BUFSIZE, "Microsoft Windows NT ");
   }else{
    return FALSE;
   }
   break;
  // Test for the Windows Me/98/95.
  case VER_PLATFORM_WIN32_WINDOWS:
   if (osvi.dwMajorVersion == 4)
   {
    switch (osvi.dwMinorVersion)
    {
     case 0:
      StringCchCatA(pszOldOS, BUFSIZE, "Microsoft Windows 95 ");
      if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')
       StringCchCatA(pszOldOS, BUFSIZE, "OSR2 " );
      break;
     case 3:  //??
      StringCchCatA(pszOldOS, BUFSIZE, "Microsoft Windows 95 OSR2 ");
     case 10:
      StringCchCatA(pszOldOS, BUFSIZE, "Microsoft Windows 98 ");
      if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')
       StringCchCatA(pszOldOS, BUFSIZE, "SE " );
      break;
     case 90:
      StringCchCatA(pszOldOS, BUFSIZE, "Microsoft Windows Millennium Edition ");
      break;
    }
   }
   break;
  case VER_PLATFORM_WIN32s:
   StringCchCatA(pszOldOS, BUFSIZE, "Microsoft Win32s ");
   break;
  default:
   return FALSE;
 }

 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
 {
  // Test for specific product on Windows NT 4.0 SP6 and later.
  if( bOsVersionInfoEx )
  {
   // Test for the workstation type.
         if ( osvi.wProductType == VER_NT_WORKSTATION)
   {
    if( osvi.dwMajorVersion == 4 )
     StringCchCatA(pszOldOS, BUFSIZE, "Workstation 4.0 " );
    else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
     StringCchCatA(pszOldOS, BUFSIZE, "Home Edition " );
    else StringCchCatA(pszOldOS, BUFSIZE, "Professional " );
   }
   // Test for the server type.
   else if ( osvi.wProductType == VER_NT_SERVER ||
    osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
   {
    // Windows NT 4.0
    if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
     StringCchCatA(pszOldOS, BUFSIZE, "Server 4.0, Enterprise Edition " );
    else StringCchCatA(pszOldOS, BUFSIZE, "Server 4.0 " );
   }
  }
  // Test for specific product on Windows NT 4.0 SP5 and earlier
  else
  {
   HKEY hKey;
   TCHAR szProductType[BUFSIZE];
   DWORD dwBufLen=BUFSIZE*sizeof(TCHAR);
   LONG lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
    TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"), 0, KEY_QUERY_VALUE, &hKey );
   if( lRet != ERROR_SUCCESS )
    return FALSE;

   lRet = RegQueryValueEx( hKey, TEXT("ProductType"),
    NULL, NULL, (LPBYTE) szProductType, &dwBufLen);
   RegCloseKey( hKey );

   if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE*sizeof(TCHAR)) )
    return FALSE;

   if ( lstrcmpi( TEXT("WINNT"), szProductType) == 0 )
    StringCchCatA(pszOldOS, BUFSIZE, "Workstation " );
   if ( lstrcmpi( TEXT("LANMANNT"), szProductType) == 0 )
    StringCchCatA(pszOldOS, BUFSIZE, "Server " );
   if ( lstrcmpi( TEXT("SERVERNT"), szProductType) == 0 )
    StringCchCatA(pszOldOS, BUFSIZE, "Advanced Server " );
   char szVer[20];
   StringCchPrintfA(szVer, sizeof(szVer), "%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion );
   StringCchCatA(pszOldOS, BUFSIZE, szVer);
  }

  // Display service pack (if any) and build number.
  char sp6[] = "Service Pack 6";
  char szBuf[40];
  if( osvi.dwMajorVersion == 4 &&
   lstrcmpiA( osvi.szCSDVersion, sp6 ) == 0 )
  {
   HKEY hKey;
   LONG lRet;

   // Test for SP6 versus SP6a.
   lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
    TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009"), 0, KEY_QUERY_VALUE, &hKey );
   if( lRet == ERROR_SUCCESS )
   {
    StringCchPrintfA(szBuf, sizeof(szBuf), "Service Pack 6a (Build %d)", osvi.dwBuildNumber & 0xFFFF );
    StringCchCatA(pszOldOS, BUFSIZE, szBuf);
   }
   else // Windows NT 4.0 prior to SP6a
   {
    StringCchPrintfA(szBuf, sizeof(szBuf), "%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
    StringCchCatA(pszOldOS, BUFSIZE, szBuf);
   }
   RegCloseKey( hKey );
  }
  else // not Windows NT 4.0
  {
   StringCchPrintfA(szBuf, sizeof(szBuf), "%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
   StringCchCatA(pszOldOS, BUFSIZE, szBuf);
  }
 }

 return TRUE;
}

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

 if( GetOSDisplayString( szOS ) ){
        _tprintf( TEXT("\n%s\n"), szOS );
 }else{
  char szOldOS[BUFSIZE] = {0};
  if ( GetOldOSVer(szOldOS) ){
   printf("\n%s\n", szOldOS);
  }
 }
}

   以上代码在Win98 SE/Windows Me/Windows NT4 Workstation/Win2000 Server/Windows XP/Win2003 Server Standard 32bit/Win7 Home Basic 64bit/Win8 Preview 32bit等32位/64位Windows系统中测试通过。Win95下因为是用VS2005编译的,无法执行,估计是调用API参数不匹配,导致执行出错,Windows 3.1当然也不行了,但Win95是有GetVersionEx这个函数的,用VC6写一个类似的函数就可以在Win95下执行。不过,用VC6要实现更多高级判别功能比较麻烦,因为必须自己定义一大堆的常量/结构以及API,好在Win 95用的人已经很少了。

  下面是用VC6写的简单测试代码,编译后可在Win95下正常运行:

// GetOSVer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

#ifndef SM_SERVERR2
#define SM_SERVERR2 89
#endif 


int main(int argc, char* argv[])
{
 OSVERSIONINFOEXA osvi;
 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEXA));

 // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
 // If that fails, try using the OSVERSIONINFO structure.
 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
 BOOL bOsVersionInfoEx = GetVersionExA ((OSVERSIONINFOA *) &osvi);
 if( !bOsVersionInfoEx )
 {
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
  if (! GetVersionExA ( (OSVERSIONINFOA *) &osvi) )
  {
   printf("Unknow Windows? ");
   return FALSE;
  }
 }

 switch (osvi.dwPlatformId)
 {
  // Test for the Windows NT product family.
  case VER_PLATFORM_WIN32_NT:
   switch (osvi.dwMajorVersion)
   {
    case 5:
     switch (osvi.dwMinorVersion)
     {
      case 0:
       printf("Microsoft Windows 2000 ");
       break;
      case 1:
       printf ("Microsoft Windows XP ");
       break;
      case 2:
       if( GetSystemMetrics(SM_SERVERR2) ){
        printf( "Microsoft Windows Server 2003 \"R2\" ");
       }else{
        printf ("Microsoft Windows Server 2003, ");
       }
       break;
     }
     break;
    default:
     if (osvi.dwMajorVersion <= 4){
      printf ("Microsoft Windows NT ");
     }
     break;
   }
  // Test for the Windows Me/98/95.
  case VER_PLATFORM_WIN32_WINDOWS:
   if (osvi.dwMajorVersion == 4)
   {
    switch (osvi.dwMinorVersion)
    {
     case 0:
      printf ("Microsoft Windows 95 ");
      if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')
       printf("OSR2 " );
      break;
     case 10:
      printf ("Microsoft Windows 98 ");
      if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')
       printf("SE " );
      break;
     case 90:
      printf ("Microsoft Windows Millennium Edition ");
      break;
    }
   }
   break;
  case VER_PLATFORM_WIN32s:
   printf("Microsoft Win32s ");
   break;
  default:
   printf("Unknow windows: Platform=%d, Version=%d.%d ", osvi.dwPlatformId, osvi.dwMajorVersion, osvi.dwMinorVersion);
   break;
 }

 return 0;
}
  其实,如果不需要这么详细的版本信息,并且只需要处理NT内核的Windows,还有一个超简单的方法:查询注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的几个键值就可以了,比如 ProductName/CurrentVersion/CurrentBuildNumber/CSDVersion 等等。不过,对Windows NT 4及3.51等老的NT系统有点麻烦,因为NT的注册表中没有 ProductName !而只有 CurrentVersion/CurrentBuildNumber/CSDVersion 等键值,所以需要自己判定。 对Windows 95/98/Me,则可以取 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion 下的键值,比如 ProductName/VersionNumber/SubVersionNumber 等等。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值