C ++ Vérifiez si Windows 10

Je fais une application pour OS spécifique, mais je ne peux pas sembler restreindre Windows 10, il est comme Windows 8. Je l’ai testé sur Windows 10 Pro et le résultat est majeur: 6 Min: 2. Existe-t-il un autre moyen de vérifier si Windows 10 est plus efficace?

EDIT: Une API fonctionnant correctement RtlGetVersion () fonctionne correctement pour tous les systèmes d’exploitation!

#include "windows.h" #include  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(); } 

C’est assez ironique, mais …

 BOOL WINAPI IsWindows10OrGreater(void); 

Docs ici .

Edit : Les génies de Redmond semblent avoir du mal à penser avec des prototypes ou, en d’autres termes, l’OP obtient une erreur de symbole indéfinie comme indiqué dans les commentaires. Il y a aussi cette fonction:

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

Et pour Windows 10, wMajorVersion , wMinorVersion et wServicePackMajor semblent être respectivement 10 , 0 et 0 .

Docs pour cette fonction ici .

Deuxième édition : C’est officiel: IsWindowsVersionOrGreater() et GetVersionEx() sont cassés à partir de 8.1. Utilisez toujours IsWindowsXXXOrGreater() , où XXX peut être XP , XPSP1 , XPSP2 , XPSP3 , Vista , VistaSP1 , VistaSP2 , 7 , 7SP1 , 8 , 8Point1 , 10 ou Server .

UPDATE: coché win7, win8.1 et win10. maintenant tout est déterminant. Donc le code:

 #include  #include  #include  std::ssortingng getWinVerion() { OSVERSIONINFO info; ZeroMemory(&info, sizeof(OSVERSIONINFO)); info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&info); std::ssortingng version = std::to_ssortingng(info.dwMajorVersion); version.append(".").append(std::to_ssortingng(info.dwMinorVersion)); if (IsWindows7SP1OrGreater()) { if (version == "6.1") return "6.1"; } if (IsWindows8Point1OrGreater()) return "6.3"; else return "10.0"; } 

C’est vrai, le seul moyen de détecter si c’est Windows 10 est d’utiliser

 BOOL WINAPI IsWindows10OrGreater(void); 

Bien que vous ayez besoin du dernier SDK à l’aide de Visual Studio 2015. Sachez que

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

ne fonctionne PAS sur Windows 10, de même que:

 BOOL WINAPI GetVersionEx( _Inout_ LPOSVERSIONINFO lpVersionInfo); 

Qui retourne parfois 6.2 ou 6.3. (Entièrement déprécié sous Windows 10).

Après a travaillé pour moi:

 . . . #include  #include  #include  . . . 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; } } 

Réf. : ( http://yamatyuu.net/computer/program/vc2013/rtlgetversion/index.html )