簡體   English   中英

檢查 Windows 版本

[英]Check Windows version

如果計算機上安裝的 Windows 版本是 Windows Vista 及更高版本(Windows 7),我如何檢查 C++?

此線程中的所有答案都指向您使用GetVersionGetVersionEx進行此測試,這是不正確的 這似乎有效,但風險很大。 Windows 操作系統升級的 appcompat 問題的主要來源來自基於GetVersion結果的糟糕的編寫測試,以及錯誤的假設或錯誤的比較。

進行此測試的正確方法是使用VerifyVersionInfo ,而不是GetVersionGetVersionEx

如果您使用的是 VS 2013 編譯器工具集和 Windows 8.1 SDK,則可以使用VersionHelpers.h並調用IsWindowsVistaOrGreater

如果您使用 VS 2013 v120_xp平台工具集來定位 Windows XP,則您實際上使用的是 Windows 7.1A SDK,因此您需要直接使用VeriyVersionInfo

否則,請使用:

bool IsWindowsVistaOrGreater()
{
OSVERSIONINFOEXW osvi = {};
osvi.dwOSVersionInfoSize = sizeof(osvi);
DWORDLONG const dwlConditionMask = VerSetConditionMask(
    VerSetConditionMask(
    VerSetConditionMask(
            0, VER_MAJORVERSION, VER_GREATER_EQUAL),
               VER_MINORVERSION, VER_GREATER_EQUAL),
               VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_VISTA);
osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_VISTA);
osvi.wServicePackMajor = 0;

return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}

此代碼適用於 Windows 2000 或更高版本,並為您提供可靠的結果。 如果您確實需要在 Windows 98 或 Windows ME 上運行此測試——並且您使用的編譯器工具集足夠老,可以在該平台上實際運行,那么您將執行相同的測試,但使用顯式而不是隱式鏈接。 版本號中有什么?

此外,默認情況下,使用GetVersionGetVersionEx將在 Windows 8.1 和 Windows 10 上獲得錯誤的版本。請參閱Manifest Madness

請注意,在 Windows 10 中, VerifyVersionInfo也受制於相同的基於清單的行為(即,如果沒有 Windows 10 的 GUID 元素,VVI 就像操作系統版本號是 6.2 而不是 10.0。也就是說,大多數真實世界的測試,如IsWindowsVistaOrGreater , IsWindows7OrGreater , IsWindows7SP1OrGreater , IsWindows8OrGreater即使沒有清單也能正常工作。只有當您使用IsWindows8Point1OrGreaterIsWindows10OrGreater ,基於清單的行為才很重要。

另請參閱堆棧溢出線程。

使用kernel32.dll定義的GetVersionEx API 函數:

bool IsWindowsVistaOrHigher() {
   OSVERSIONINFO osvi;
   ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   GetVersionEx(&osvi);
   return osvi.dwMajorVersion >= 6;
}

與檢查 Windows NT 版本的其他測試類似:

OSVERSIONINFO   vi;

memset (&vi, 0, sizeof vi);
vi .dwOSVersionInfoSize = sizeof vi;
GetVersionEx (&vi);
if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT  &&  vi.dwMajorVersion >= 6)

在 Visual Studio 2013 或更高版本中,您還可以使用新的 Version Helper 函數。

有許多不同的 Windows 版本的方法。 例子:

#include <VersionHelpers.h>

if (!IsWindowsVistaOrGreater())
{
   MessageBox(NULL, "You need at least Windows Vista", "Version Not Supported", MB_OK);
}

更多信息在這里

我認為您正在尋找GetVersionEx函數。

Microsoft 支持頁面為您提供舊版本的詳細信息。

要確定在給定系統上運行的操作系統,需要以下數據:

 95 98 ME NT 4 2000 XP PlatformID 1 1 1 2 2 2 Major version 4 4 4 4 5 5 Minor version 0 10 90 0 0 1

您可以實現代碼並在 Vista 和 Windows-7 機器上運行它以檢查返回的值。

要獲取操作系統版本信息,請進行以下調用:

System::OperatingSystem *osInfo = System::Environment::OSVersion;

您可以使用 kernel32.dll 中的 GetVersion() 或 GetVersionEx() 函數。 這兩個功能僅在 Windows 2000 或更高版本上可用。

要閱讀有關此內容的更多信息,請訪問http://msdn.microsoft.com/en-us/library/ms724451%28VS.85%29.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM