version下載 - visual c++下載




檢測Windows 10版本 (2)

來自 VersionHelpers.h IsWindows10OrGreater()

查看 MSDN 上的 版本幫助器功能上 的註釋

Windows 10 SDK附帶了文件 VersionHelpers.h ,但它也可以在以前的版本中使用。 只需將其複製到您的開發環境即可。

它只是一個僅標頭定義的小庫,它使用 VerSetConditionMaskVerifyVersionInfoW 函數,自Windows 2000以來,這兩個函數在WinAPI中都可用。

更新 如果源代碼中不能包含清單文件,則可以使用簡單的技巧:只需使用 GetFileVersionInfo 函數獲取任何系統dll的版本,例如 kernel32.dll

我的目標是在我的代碼中檢測Windows 10,該代碼必須能夠跨平台以及跨Windows的不同版本(至少7版及更高版本)運行。 Windows提供了 IsWindows10OrGreater() 解決此問題,但是還有另一個問題,該功能在以前的Windows版本中不存在。

您會發現無數有關此問題的博客和SO問題,以及明顯的瘋狂現象,其中諸如this和getversion之類的函數會返回不同的版本,而不是正確的版本。

例如在我的機器上 IsWindows10OrGreater() 方法無法編譯(我必須安裝Win10 SDK),而 IsWindowsVersionOrGreater() 報告 6 為主要版本。

那麼,有沒有一種明智的多版本方法可以解決此問題?


您可以從註冊表中讀取真實的內部版本號,然後從中推斷Windows版本。 您的應用程序不需要此工作清單即可:在我的計算機上,它可以正確檢測到操作系統內部版本號為10586。例如:

#include <Windows.h>
#include <sstream>

struct HKeyHolder
{
private:
    HKEY m_Key;

public:
    HKeyHolder() :
        m_Key(nullptr)
    {
    }

    HKeyHolder(const HKeyHolder&) = delete;
    HKeyHolder& operator=(const HKeyHolder&) = delete;

    ~HKeyHolder()
    {
        if (m_Key != nullptr)
            RegCloseKey(m_Key);
    }

    operator HKEY() const
    {
        return m_Key;
    }

    HKEY* operator&()
    {
        return &m_Key;
    }
};

bool IsRunningOnWindows10()
{
    HKeyHolder currentVersion;
    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, LR"(SOFTWARE\Microsoft\Windows NT\CurrentVersion)", 0, KEY_QUERY_VALUE, &currentVersion) != ERROR_SUCCESS)
        return false;

    DWORD valueType;
    BYTE buffer[256];
    DWORD bufferSize = 256;

    if (RegQueryValueExW(currentVersion, L"CurrentBuild", nullptr, &valueType, buffer, &bufferSize) != ERROR_SUCCESS)
        return false;

    if (valueType != REG_SZ)
        return false;

    int version;
    std::wistringstream versionStream(reinterpret_cast<wchar_t*>(buffer));
    versionStream >> version;

    return version > 9800;
}




winapi