web-dev-qa-db-fra.com

Détection de la version Windows 10

Mon objectif est de détecter Windows 10 dans mon code qui doit fonctionner sur plusieurs plates-formes ainsi que sur différentes versions de Windows (au moins 7 et plus). Windows fournit IsWindows10OrGreater() pour résoudre ce problème, mais il y a un autre problème, cette fonction n'est pas présente dans les versions précédentes de Windows.

Vous trouverez d'innombrables blogs et SO questions à ce sujet ainsi que la folie manifeste où des fonctions comme celle-ci et getversion et d'autres renvoient une version différente plutôt que la bonne.

Par exemple sur ma machine - la méthode IsWindows10OrGreater() ne se compile pas (j'aurais à installer Win10 SDK), et IsWindowsVersionOrGreater() rapports 6 comme version principale.

Alors, existe-t-il une façon multi-version saine de résoudre ce problème?

21
hg_git

IsWindows10OrGreater() de VersionHelpers.h

Vérifiez les notes sur les fonctions de Version Helper sur MSDN

Fichier VersionHelpers.h est fourni avec le SDK Windows 10, mais il fonctionnera également dans les versions précédentes. Copiez-le simplement dans votre environnement de développement.

Il s'agit simplement d'une petite bibliothèque définie uniquement dans l'en-tête, qui utilise les fonctions VerSetConditionMask et VerifyVersionInfoW, toutes deux disponibles dans WinAPI depuis Windows 2000.

Upd Si vous ne pouvez pas inclure de fichier manifeste avec votre code source, vous pouvez utiliser un hack simple: obtenez simplement une version de n'importe quelle DLL système, par exemple, kernel32.dll en utilisant la fonction GetFileVersionInfo.

2
vladon

Vous pouvez lire le vrai numéro de build dans le registre, puis en déduire la version Windows. Votre application n'a pas besoin d'avoir un manifeste pour ce travail: sur ma machine, elle détecte correctement le numéro de build du système d'exploitation comme 10586. Par exemple:

#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;
}
0
Sunius