Chinaunix首页 | 论坛 | 博客
  • 博客访问: 109569
  • 博文数量: 52
  • 博客积分: 2050
  • 博客等级: 大尉
  • 技术积分: 451
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-06 15:52
文章分类

全部博文(52)

文章存档

2011年(1)

2010年(2)

2009年(49)

我的朋友

分类:

2009-12-15 09:47:04

#include <shlwapi.h> #include <tchar.h>
#include
<stdio.h>

#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
*GETNATIVESYSTEMINFO)(LPSYSTEM_INFO);
typedef BOOL (WINAPI
*GETPRODUCTINFO)(DWORD , DWORD, DWORD, DWORD, PDWORD);
 
BOOL CrnGetWindowsVersion(LPTSTR pszOS)
{
    OSVERSIONINFOEX osvi;
    SYSTEM_INFO si;
    GETNATIVESYSTEMINFO pGNSI;
    GETPRODUCTINFO 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 1;

   
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.

    pGNSI
= (GETNATIVESYSTEMINFO)GetProcAddress(
            GetModuleHandle(TEXT(
"kernel32.dll")), "GetNativeSystemInfo");
   
if (NULL != pGNSI)
        pGNSI(
&si);
   
else
        GetSystemInfo(
&si);

   
if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId && osvi.dwMajorVersion > 4)
    {
        strncpy(pszOS, TEXT(
"Microsoft "), BUFSIZE);

       
// Test for the specific product.
        if (osvi.dwMajorVersion == 6)
        {
           
if (osvi.dwMinorVersion == 0)
            {
               
if (osvi.wProductType == VER_NT_WORKSTATION)
                    strcat(pszOS, TEXT(
"Windows Vista "));
               
else
                    strcat(pszOS, TEXT(
"Windows Server 2008 "));
            }
           
else if (osvi.dwMinorVersion == 1)
                strcat(pszOS, TEXT(
"Windows 7 "));

            pGPI
= (GETPRODUCTINFO)GetProcAddress(
                    GetModuleHandle(TEXT(
"kernel32.dll")), "GetProductInfo");
           
if (pGPI)
            {
                pGPI(
6, 0, 0, 0, &dwType);
            }

           
switch (dwType)
            {
               
case PRODUCT_ULTIMATE:
                    strcat(pszOS, TEXT(
"Ultimate Edition"));
                   
break;
               
case PRODUCT_HOME_PREMIUM:
                    strcat(pszOS, TEXT(
"Home Premium Edition"));
                   
break;
               
case PRODUCT_HOME_BASIC:
                    strcat(pszOS, TEXT(
"Home Basic Edition"));
                   
break;
               
case PRODUCT_ENTERPRISE:
                    strcat(pszOS, TEXT(
"Enterprise Edition"));
                   
break;
               
case PRODUCT_BUSINESS:
                    strcat(pszOS, TEXT(
"Business Edition"));
                   
break;
               
case PRODUCT_STARTER:
                    strcat(pszOS, TEXT(
"Starter Edition"));
                   
break;
               
case PRODUCT_CLUSTER_SERVER:
                    strcat(pszOS, TEXT(
"Cluster Server Edition"));
                   
break;
               
case PRODUCT_DATACENTER_SERVER:
                    strcat(pszOS, TEXT(
"Datacenter Edition"));
                   
break;
               
case PRODUCT_DATACENTER_SERVER_CORE:
                    strcat(pszOS, TEXT(
"Datacenter Edition (core installation)"));
                   
break;
               
case PRODUCT_ENTERPRISE_SERVER:
                    strcat(pszOS, TEXT(
"Enterprise Edition"));
                   
break;
               
case PRODUCT_ENTERPRISE_SERVER_CORE:
                    strcat(pszOS, TEXT(
"Enterprise Edition (core installation)"));
                   
break;
               
case PRODUCT_ENTERPRISE_SERVER_IA64:
                    strcat(pszOS, TEXT(
"Enterprise Edition for Itanium-based Systems"));
                   
break;
               
case PRODUCT_SMALLBUSINESS_SERVER:
                    strcat(pszOS, TEXT(
"Small Business Server"));
                   
break;
               
case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
                    strcat(pszOS, TEXT(
"Small Business Server Premium Edition"));
                   
break;
               
case PRODUCT_STANDARD_SERVER:
                    strcat(pszOS, TEXT(
"Standard Edition"));
                   
break;
               
case PRODUCT_STANDARD_SERVER_CORE:
                    strcat(pszOS, TEXT(
"Standard Edition (core installation)"));
                   
break;
               
case PRODUCT_WEB_SERVER:
                    strcat(pszOS, TEXT(
"Web Server Edition"));
                   
break;
               
default:
                    strcat(pszOS, TEXT(
"Unknown"));
                   
break;
            }
           
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
                strcat(pszOS, TEXT(
", 64-bit"));
           
else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
                strcat(pszOS, TEXT(
", 32-bit"));
        }

       
if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
        {
           
if (GetSystemMetrics(SM_SERVERR2))
                strcat(pszOS, TEXT(
"Windows Server 2003 R2, "));
           
else if (osvi.wSuiteMask == VER_SUITE_STORAGE_SERVER)
                strcat(pszOS, TEXT(
"Windows Storage Server 2003"));
           
else if (osvi.wProductType == VER_NT_WORKSTATION
                   
&& si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
                strcat(pszOS, TEXT(
"Windows XP Professional x64 Edition"));
           
else
                strcat(pszOS, 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) == VER_SUITE_DATACENTER)
                        strcat(pszOS, TEXT(
"Datacenter Edition for Itanium-based Systems"));
                   
else if ((osvi.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE)
                        strcat(pszOS, TEXT(
"Enterprise Edition for Itanium-based Systems"));
                }
               
else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
                {
                   
if ((osvi.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER)
                        strcat(pszOS, TEXT(
"Datacenter x64 Edition"));
                   
else if ((osvi.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE)
                        strcat(pszOS, TEXT(
"Enterprise x64 Edition"));
                   
else
                        strcat(pszOS, TEXT(
"Standard x64 Edition"));
                }
               
else
                {
                   
if ((osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER) == VER_SUITE_COMPUTE_SERVER)
                        strcat(pszOS, TEXT(
"Compute Cluster Edition"));
                   
else if ((osvi.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER)
                        strcat(pszOS, TEXT(
"Datacenter Edition"));
                   
else if ((osvi.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE)
                        strcat(pszOS, TEXT(
"Enterprise Edition"));
                   
else if ((osvi.wSuiteMask & VER_SUITE_BLADE) == VER_SUITE_BLADE)
                        strcat(pszOS, TEXT(
"Web Edition"));
                   
else
                        strcat(pszOS, TEXT(
"Standard Edition"));
                }
            }
        }

 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
        {
            strcat(pszOS, TEXT(
"Windows XP "));
           
if ((osvi.wSuiteMask & VER_SUITE_PERSONAL) == VER_SUITE_PERSONAL)
                strcat(pszOS, TEXT(
"Home Edition"));
           
else
                strcat(pszOS, TEXT(
"Professional"));
        }

       
if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
        {
            strcat(pszOS, TEXT(
"Windows 2000 "));
           
if (osvi.wProductType == VER_NT_WORKSTATION)
            {
                strcat(pszOS, TEXT(
"Professional"));
            }
           
else
            {
               
if ((osvi.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER)
                    strcat(pszOS, TEXT(
"Datacenter Server"));
               
else if ((osvi.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE)
                    strcat(pszOS, TEXT(
"Advanced Server"));
               
else
                    strcat(pszOS, TEXT(
"Server"));
            }
        }
       
// Include service pack (if any) and build number.
        UINT uLen = strlen(osvi.szCSDVersion);
       
if (uLen > 0)
        {
            strcat(pszOS, TEXT(
" "));
            strcat(pszOS, osvi.szCSDVersion);
        }

        TCHAR szBuf[
80];
        sprintf(szBuf, TEXT(
" (build %d)"), osvi.dwBuildNumber);
        strcat(pszOS, szBuf);

       
return TRUE;
    }
   
else
    {
        MessageBox(
0,
                TEXT(
"Does not support this version of Windows."),
                TEXT(__FUNC__),
                MB_ICONWARNING
| MB_OK | MB_TASKMODAL | MB_SETFOREGROUND);

       
return FALSE;
    }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TCHAR sz[
256];
   
if (CrnGetWindowsVersion(sz))
        ShowMessage(sz);
}

阅读(912) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~