2015-08-25 83 views
10

我正在製作一個應用程序到特定的操作系統,但我似乎無法縮小Windows 10,它出現在Windows 8中。我已經在Window 10 Pro上進行了測試,結果是Major:6閔:2。是否有另一種方法來檢查它是否更有效率的Windows 10?C++檢查Windows 10

編輯:找到一個正常工作的API RtlGetVersion()適用於所有操作系統!

#include "windows.h" 
#include <iostream> 
using namespace std; 
BOOL EqualsMajorVersion(DWORD majorVersion) 
{ 
OSVERSIONINFOEX osVersionInfo; 
::ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX)); 
osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 
osVersionInfo.dwMajorVersion = majorVersion; 
ULONGLONG maskCondition = ::VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); 
return ::VerifyVersionInfo(&osVersionInfo, VER_MAJORVERSION, maskCondition); 
} 
BOOL EqualsMinorVersion(DWORD minorVersion) 
{ 
OSVERSIONINFOEX osVersionInfo; 
::ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX)); 
osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 
osVersionInfo.dwMinorVersion = minorVersion; 
ULONGLONG maskCondition = ::VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL); 
return ::VerifyVersionInfo(&osVersionInfo, VER_MINORVERSION, maskCondition); 
} 
int main() 
{ 
    if (EqualsMajorVersion(7) && EqualsMinorVersion(1)) 
     printf("Maj:7 Min:1"); 
    else if (EqualsMajorVersion(7) && EqualsMinorVersion(0)) 
     printf("Maj:7 Min:0"); 
    else if (EqualsMajorVersion(6) && EqualsMinorVersion(7)) 
     printf("Maj:6 Min:7"); 
    else if (EqualsMajorVersion(6) && EqualsMinorVersion(6)) 
     printf("Maj:6 Min:6"); 
    else if (EqualsMajorVersion(6) && EqualsMinorVersion(5)) 
     printf("Maj:6 Min:5"); 
    else if (EqualsMajorVersion(6) && EqualsMinorVersion(4)) 
     printf("Maj:6 Min:4"); 
    else if (EqualsMajorVersion(6) && EqualsMinorVersion(3)) 
     printf("Maj:6 Min:3"); 
    else if (EqualsMajorVersion(6) && EqualsMinorVersion(2)) 
     printf("Maj:6 Min:2"); 
    else if (EqualsMajorVersion(6) && EqualsMinorVersion(1)) 
     printf("Maj:6 Min:1"); 
    else if (EqualsMajorVersion(6) && EqualsMinorVersion(0)) 
     printf("Maj:6 Min:0"); 
    else if (EqualsMajorVersion(5) && EqualsMinorVersion(2)) 
     printf("Maj:5 Min:2"); 
    else if (EqualsMajorVersion(5) && EqualsMinorVersion(1)) 
     printf("Maj:5 Min:1"); 
    else 
     printf("OS not on list..."); 
    getchar(); 
} 
+1

一些思考:微軟曾表示,新版本的Windows將模擬舊的作爲程序清單聲稱,它是內置的版本。無論是通過兼容性庫還是虛擬機完成,未來都是開放的。但是因爲這個原因,我不確定你是否可以從應用程序中找到操作系統版本。 –

+0

如何使用['GetVersionEx'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724451%28v=vs.85%29.aspx)?這也允許你緩存結構,你只需要調用一次。 –

+2

**不要爲C++問題添加C標籤!** – Olaf

回答

10

這是很諷刺,但是......

​​

文檔here

編輯:從微軟的天才似乎與原型思考問題,或者換句話說,如在註釋中規定的OP得到一個未定義的符號錯誤。分別

BOOL WINAPI IsWindowsVersionOrGreater(
    WORD wMajorVersion, 
    WORD wMinorVersion, 
    WORD wServicePackMajor 
); 

而且,對於Windows 10,wMajorVersionwMinorVersion,並wServicePackMajor似乎是,100,並且0:還有這個功能。

該功能的文檔here

第二編輯:它的官方:IsWindowsVersionOrGreater()GetVersionEx()從8.1開始分裂。使用IsWindowsXXXOrGreater()總是代替,其中XXX可以XPXPSP1XPSP2XPSP3VistaVistaSP1VistaSP277SP188Point110,或Server

+0

該API看起來不錯,但沒有定義,我正在使用VS2015編譯器平臺,它仍然無法正常工作。 – user3732111

+0

經測試,仍然無法使用「10,0和0」。 – user3732111

+0

他是否包含VersionHelpers.h?文檔說你必須使用該頭文件。 –

2

那是真的,來檢測,如果這是由於Windows 10的唯一方法是通過使用

​​

雖然你需要有最新的SDK使用Visual Studio 2015年 注意

BOOL WINAPI IsWindowsVersionOrGreater(
WORD wMajorVersion, 
WORD wMinorVersion, 
WORD wServicePackMajor); 

不工作在Windows 10,同樣是:

BOOL WINAPI GetVersionEx(_Inout_ LPOSVERSIONINFO lpVersionInfo); 

哪有時返回6.2或6.3。 (在Windows 10上完全隱藏)。

+0

IsWindowsVersionOrGreater()或IsWindowsVersionOrGreater()在我的Win10上也不能正常工作 – zeetit

2

繼爲我工作:

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

typedef void (WINAPI * RtlGetVersion_FUNC) (OSVERSIONINFOEXW *); 
BOOL GetVersion(OSVERSIONINFOEX * os) { 
    HMODULE hMod; 
    RtlGetVersion_FUNC func; 
#ifdef UNICODE 
    OSVERSIONINFOEXW * osw = os; 
#else 
    OSVERSIONINFOEXW o; 
    OSVERSIONINFOEXW * osw = &o; 
#endif 

    hMod = LoadLibrary(TEXT("ntdll.dll")); 
    if (hMod) { 
     func = (RtlGetVersion_FUNC)GetProcAddress(hMod, "RtlGetVersion"); 
     if (func == 0) { 
      FreeLibrary(hMod); 
      return FALSE; 
     } 
     ZeroMemory(osw, sizeof (*osw)); 
     osw->dwOSVersionInfoSize = sizeof (*osw); 
     func(osw); 
#ifndef UNICODE 
     os->dwBuildNumber = osw->dwBuildNumber; 
     os->dwMajorVersion = osw->dwMajorVersion; 
     os->dwMinorVersion = osw->dwMinorVersion; 
     os->dwPlatformId = osw->dwPlatformId; 
     os->dwOSVersionInfoSize = sizeof (*os); 
     DWORD sz = sizeof (os->szCSDVersion); 
     WCHAR * src = osw->szCSDVersion; 
     unsigned char * dtc = (unsigned char *)os->szCSDVersion; 
     while (*src) 
      * Dtc++ = (unsigned char)* src++; 
     *Dtc = '\ 0'; 
#endif 

    } else 
     return FALSE; 
    FreeLibrary(hMod); 
    return TRUE; 
} 

. 
. 
. 

//check win10 
void mymethod() { 

OSVERSIONINFOEX os; 

    if (GetVersion(&os) == TRUE && os.dwMajorVersion == 10) 
    { 
     isWin10 = TRUE; 
    } 

} 

參考。 :(http://yamatyuu.net/computer/program/vc2013/rtlgetversion/index.html

+0

這個實現有一些缺陷,請看http://stackoverflow.com/questions/36543301/detecting-windows-10-版本/ 36543774#36543774。一個例子是RtlGetVersion的返回類型:不是無效的,以及OSVERSIONINFOEXW/A上指針的技巧並不乾淨。 –

+0

我已經搜索了很多獲取操作系統版本的方法(而不僅僅是如果它是更大的特定版本)。我需要所有的細節,比如內部版本號,主要版本和次要版本,這是唯一對我有效的代碼!謝謝! –

3

更新:檢查win7,win8.1和win10。現在一切都確定。所以代碼:

#include <windows.h> 
#include <VersionHelpers.h> 
#include <string> 

std::string getWinVerion() { 

OSVERSIONINFO info; 
ZeroMemory(&info, sizeof(OSVERSIONINFO)); 
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 

GetVersionEx(&info); 

std::string version = std::to_string(info.dwMajorVersion); 
version.append(".").append(std::to_string(info.dwMinorVersion)); 

if (IsWindows7SP1OrGreater()) { 
    if (version == "6.1") 
     return "6.1"; 
} 

if (IsWindows8Point1OrGreater()) 
    return "6.3"; 
else 
    return "10.0"; 
} 
+2

vc140編譯器發出錯誤並聲明GetVersionEx已被棄用 – mbaros