use*_*111 11 c++ windows operating-system windows-10
我正在制作一个特定于操作系统的应用程序,但我似乎无法缩小Windows 10,它出现在Windows 8上.我在Window 10 Pro上进行了测试,结果是主要: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();
}
Run Code Online (Sandbox Code Playgroud)
344*_*442 13
这很讽刺,但......
BOOL WINAPI IsWindows10OrGreater(void);
Run Code Online (Sandbox Code Playgroud)
文档在这里.
编辑:Redmond的天才似乎在思考原型方面存在问题,或者换句话说,OP会得到一个未定义的符号错误,如评论中所述.还有这个功能:
BOOL WINAPI IsWindowsVersionOrGreater(
WORD wMajorVersion,
WORD wMinorVersion,
WORD wServicePackMajor
);
Run Code Online (Sandbox Code Playgroud)
而且,对于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
.
以下为我工作:
.
.
.
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
参考 :(http://yamatyuu.net/computer/program/vc2013/rtlgetversion/index.html)
归档时间: |
|
查看次数: |
14278 次 |
最近记录: |