Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;检查Windows 10是否可用_C++_Windows_Operating System_Windows 10 - Fatal编程技术网

C++ C++;检查Windows 10是否可用

C++ C++;检查Windows 10是否可用,c++,windows,operating-system,windows-10,C++,Windows,Operating System,Windows 10,我正在制作一个特定于操作系统的应用程序,但我似乎无法缩小Windows 10的范围,它被称为Windows 8。我已经在Windows10Pro上测试了它,结果是:6分钟:2分钟。是否有其他方法可以更有效地检查windows 10 编辑:找到一个能正常工作的API RtlGetVersion(),它能正常工作于所有操作系统 #include "windows.h" #include <iostream> using namespace std; BOOL EqualsMajorVer

我正在制作一个特定于操作系统的应用程序,但我似乎无法缩小Windows 10的范围,它被称为Windows 8。我已经在Windows10Pro上测试了它,结果是:6分钟:2分钟。是否有其他方法可以更有效地检查windows 10

编辑:找到一个能正常工作的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();
}
#包括“windows.h”
#包括
使用名称空间std;
布尔等效主版本(DWORD主版本)
{
osVersionInfo-osVersionInfo;
::零内存(&osVersionInfo,sizeof(osVersionInfo));
osVersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
osVersionInfo.dwMajorVersion=majorVersion;
ULONGLONG maskCondition=::VerSetConditionMask(0,版本主要,版本相等);
return::VerifyVersionInfo(&osVersionInfo,主要版本,maskCondition);
}
布尔等式最小值(DWORD最小值)
{
osVersionInfo-osVersionInfo;
::零内存(&osVersionInfo,sizeof(osVersionInfo));
osVersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
osVersionInfo.dwMinorVersion=minorVersion;
ULONGLONG maskCondition=::VerSetConditionMask(0,版本号,版本号相等);
return::VerifyVersionInfo(&osVersionInfo、版本、maskCondition);
}
int main()
{
if(同等主要版本(7)和同等次要版本(1))
printf(“主要:7分钟:1”);
否则如果(相等主版本(7)和相等主版本(0))
printf(“主要:7分钟:0”);
其他if(同等主要版本(6)和同等次要版本(7))
printf(“主要:6分钟:7”);
其他if(同等主要版本(6)和同等次要版本(6))
printf(“主要:6分钟:6”);
其他if(同等主要版本(6)和同等次要版本(5))
printf(“主要:6分钟:5”);
其他if(同等主要版本(6)和同等次要版本(4))
printf(“主要:6分钟:4”);
其他if(同等主要版本(6)和同等次要版本(3))
printf(“主要:6分钟:3”);
其他if(同等主要版本(6)和同等次要版本(2))
printf(“主要:6分钟:2”);
其他if(同等主要版本(6)和同等次要版本(1))
printf(“主要:6分钟:1”);
否则如果(同等主要版本(6)和同等次要版本(0))
printf(“主要:6分钟:0”);
其他if(同等主要版本(5)和同等次要版本(2))
printf(“主要:5分钟:2”);
其他if(同等主要版本(5)和同等次要版本(1))
printf(“主要:5分钟:1”);
其他的
printf(“操作系统不在列表中…”);
getchar();
}

这很讽刺,但是

BOOL WINAPI IsWindows10OrGreater(void);
医生

编辑:雷德蒙德的天才们似乎在思考原型方面有问题,或者换句话说,OP遇到了注释中所述的未定义符号错误。还有这个功能:

BOOL WINAPI IsWindowsVersionOrGreater(
    WORD wMajorVersion,
    WORD wMinorVersion,
    WORD wServicePackMajor
);
对于Windows 10,
wMajorVersion
wminorvision
wServicePackMajor
似乎分别是
10
0
0

该功能的文档


第二次编辑:这是官方的:
isWindowsVersionOrCreater()
GetVersionEx()
从8.1版开始被中断。始终使用
IsWindowsXXXOrGreater()
,其中
XXX
可以是
XP
XPSP1
XPSP2
XPSP3
Vista
VistaSP1
VistaSP2
7
7SP1
8
8code>,
点1
,或者
Server

这是真的,检测这是否是Windows 10的唯一方法是使用

BOOL WINAPI IsWindows10OrGreater(void);
尽管您需要使用Visual Studio 2015拥有最新的SDK。 注意

BOOL WINAPI IsWindowsVersionOrGreater(
WORD wMajorVersion,
WORD wMinorVersion,
WORD wServicePackMajor);
在Windows 10上不工作,同样:

BOOL WINAPI GetVersionEx( _Inout_ LPOSVERSIONINFO lpVersionInfo);

有时返回6.2或6.3。(在Windows 10上完全去除了润滑油)。

以下内容对我很有用:

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

}
。
.
.
#包括
#包括
#包括
.
.
.
typedef void(WINAPI*RtlGetVersion_FUNC)(OSVersionInfo*);
BOOL GetVersion(OSVersionInfo*os){
hmodulehmod;
RtlGetVersion_FUNC FUNC;
#ifdef UNICODE
OSVersionInfo*osw=os;
#否则
OSVERSIONINFOEXW o;
OSVersionInfo*osw=&o;
#恩迪夫
hMod=LoadLibrary(文本(“ntdll.dll”);
如果(hMod){
func=(RtlGetVersion_func)GetProcAddress(hMod,“RtlGetVersion”);
如果(func==0){
免费图书馆;
返回FALSE;
}
零内存(osw,sizeof(*osw));
osw->DWOSVersionInfo=sizeof(*osw);
func(osw);
#ifndef UNICODE
os->dwBuildNumber=osw->dwBuildNumber;
os->dwMajorVersion=osw->dwMajorVersion;
os->dwMinorVersion=osw->dwMinorVersion;
os->dwPlatformId=osw->dwPlatformId;
os->DWOSVersionInfo=sizeof(*os);
DWORD sz=sizeof(操作系统->SZCSD版本);
WCHAR*src=osw->szcsd版本;
无符号字符*dtc=(无符号字符*)os->SZCSD版本;
while(*src)
*Dtc++=(无符号字符)*src++;
*Dtc='\0';
#恩迪夫
}否则
返回FALSE;
免费图书馆;
返回TRUE;
}
.
.
.
//检查win10
void mymethod(){
OSVersionInfo操作系统;
if(GetVersion(&os)==TRUE&&os.dwMajorVersion==10)
{
isWin10=TRUE;
}
}

参考:()

更新:已选中win7、win8.1和win10。现在一切都决定了。So代码:

#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";
}
#包括
#包括
#包括
std::string getWinVerion(){
OSVERSIONINFO信息;
零内存(&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));
如果(IsWindows7SP1OrGreater()){
如果(版本==“6.1”)
返回“6.1”;
}
如果(ISWindows8Point1OrgCreater())
返回“6.3”;
其他的
返回“10.0”;
}

需要考虑的问题:微软表示,较新版本的Windows将模仿较旧版本,正如《程序清单》声称的版本。这是通过兼容库还是虚拟机来实现的,这一点在将来是开放的。但是因为这个