С++ Проверьте, не работает ли Windows 10
Я делаю приложение для ОС, но я не могу сузить Windows 10, оно появляется как Windows 8. Я тестировал его на Windows 10 Pro, и результат был майор: 6 мин: 2. Есть ли другой способ проверить, эффективнее ли он Windows 10?
EDIT: Найден правильно работающий 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
Это довольно иронично, но...
BOOL WINAPI IsWindows10OrGreater(void);
Docs здесь.
Изменить. У гениев из Редмонда, похоже, проблемы с мышлением с прототипами, или, другими словами, OP получает ошибку символа undefined, как указано в комментариях. Там также эта функция:
BOOL WINAPI IsWindowsVersionOrGreater(
WORD wMajorVersion,
WORD wMinorVersion,
WORD wServicePackMajor
);
И для Windows 10, wMajorVersion
, wMinorVersion
и wServicePackMajor
отображаются соответственно 10
, 0
и 0
.
Документы для этой функции здесь.
Второе редактирование. Официально: IsWindowsVersionOrGreater()
и GetVersionEx()
нарушаются с 8.1. Вместо этого используйте IsWindowsXXXOrGreater()
, где XXX
может быть XP
, XPSP1
, XPSP2
, XPSP3
, Vista
, VistaSP1
, VistaSP2
, 7
, 7SP1
, 8
, 8Point1
, 10
или Server
.
Ответ 2
UPDATE: проверено 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";
}
Ответ 3
Это верно, единственный способ определить, является ли это Windows 10, с помощью
BOOL WINAPI IsWindows10OrGreater(void);
Хотя вам нужна последняя версия 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).
Ответ 4
После меня работали:
.
.
.
#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;
}
}
Ref.: (http://yamatyuu.net/computer/program/vc2013/rtlgetversion/index.html)