OSVERSIONINFO  version; 
DWORD dwMajor,dwMinor;
::GetVersionEx(&version);  
dwMajor=version.dwMajorVersion;  
dwMinor=version.dwMinorVersion; 
if(dwMajor == 6 && dwMinor == 0)//为 vista 
这种方法不起作用,我的vista是64位的.

解决方案 »

  1.   

    这是我的一个函数,已经测试,绝对可以用,支持Win2000至Win7,X86和X64版本// 取得操作系统信息,仅支持 Microsoft Win2000 以上
    BOOL g_GetOSDisplayString(LPTSTR pszOS, LPTSTR pszMain, LPTSTR pszBuild)
    {
    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( 6, 0, 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 ( si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 )
    StringCchCat(pszOS, BUFSIZE, TEXT(", 64-bit" ));
    else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL )
    StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit"));
    }
    }
      

  2.   

    接上 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.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);
    }
    StringCchCopy(pszMain, BUFSIZE, pszOS);
    TCHAR buf[80];
    ::SecureZeroMemory(buf, sizeof(buf));
    StringCchCat(pszOS, BUFSIZE, TEXT("\n") );
    StringCchPrintf( buf, 80, TEXT("(Build %d.%d.%d)"), osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber);
    StringCchCat(pszOS, BUFSIZE, buf);
    StringCchCopy(pszBuild, BUFSIZE, buf); HKEY hKey;
    TCHAR szBuildLab[BUFSIZE];
    DWORD dwBufLen = BUFSIZE * sizeof(TCHAR);
    LONG lRet; ::SecureZeroMemory(szBuildLab, sizeof(szBuildLab));
    lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), 0, KEY_QUERY_VALUE, &hKey);
    if(lRet == ERROR_SUCCESS)
    {
    lRet = RegQueryValueEx(hKey, TEXT("BuildLab"), NULL, NULL, (LPBYTE)szBuildLab, &dwBufLen);
    RegCloseKey(hKey);
    if((lRet == ERROR_SUCCESS) && (dwBufLen <= BUFSIZE * sizeof(TCHAR)))
    {
    if(_tcslen(szBuildLab) != 0)
    {
    StringCchCat(pszOS, BUFSIZE, TEXT(", (内部版本: ") );
    StringCchCat(pszOS, BUFSIZE, szBuildLab);
    StringCchCat(pszOS, BUFSIZE, TEXT(")") ); StringCchCat(pszBuild, BUFSIZE, TEXT(", (内部版本: ") );
    StringCchCat(pszBuild, BUFSIZE, szBuildLab);
    StringCchCat(pszBuild, BUFSIZE, TEXT(")") );
    }
    }
    }
    return TRUE; 
       }
       else
       {  
       printf("This sample does not support this version of Windows.\n");
       return FALSE;
       }
      

  3.   

    (dwPlatformId == 2 && dwMajorVersion >= 6 && dwMinorVersion >= 0) 就是 Vista。
    参见微软官方:http://msdn.microsoft.com/en-us/library/ms724832(VS.85).aspx
      

  4.   

    dwMajorVersion == 6 就知道是vista
    然后 GetNativeSystemInfo 中得到dwProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 判断是64位os