再贴一判断winNT版本的代码

来源:互联网 发布:besiege mac汉化 编辑:程序博客网 时间:2024/06/01 11:55

转自

http://msdn.microsoft.com/en-gb/library/ms724429.aspx


但其中有一句怀疑原文是错了,如果照抄我这边得不到正确的结果

//  original would not get the result
// if(bOsVersionInfoEx != NULL ) return 1;
   if(bOsVersionInfoEx == NULL ) return 1;


#include <windows.h>
#include <tchar.h>#include <stdio.h>#include <strsafe.h>
#pragma comment(lib, "User32.lib")#define BUFSIZE 256typedef 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;   DWORD dwType;   BOOL bOsVersionInfoEx;   ZeroMemory(&si, sizeof(SYSTEM_INFO));   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);   bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi);//  original would not get the result//if(bOsVersionInfoEx != NULL ) return 1;   if(bOsVersionInfoEx == NULL ) 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_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;         }      }      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;   }}int __cdecl _tmain(){    TCHAR szOS[BUFSIZE];    if( GetOSDisplayString( szOS ) )        _tprintf( TEXT("\n%s\n"), szOS );}

//output



Microsoft Windows 7 Ultimate Edition Service Pack 1 (build 7601), 32-bit
请按任意键继续. . .

原创粉丝点击