在我的开发计算机上运行Windows 10。试图让操作系统版本返回10. Tried this的主要版本,并通过System::Environment::OSVersion->VersionString
尝试环境变量。两者都返回Microsoft Windows NT 6.2.9200
。在Windows 7计算机上测试可执行文件,我得到6.1.*
(正确)。
在Powershell中运行我得到了正确的结果:
PS Z:\> [System.Environment]::OSVersion.Version
Major Minor Build Revision
----- ----- ----- --------
10 0 14393 0
我使用相同的环境变量逻辑在Visual Studio中编写了一个测试C ++程序...
#include <Windows.h>
#include <iostream>
using namespace std;
int main(int argc, char **argv, char** envp) {
printf("Current compiler version is ... %d\n", _MSC_VER);
printf("Current compiler full version is ... %d\n", _MSC_FULL_VER);
printf("Current OSVersion is ... %s\n\n", System::Environment::OSVersion->VersionString);
char** env;
for (env = envp; *env != 0; env++)
{
char* thisEnv = *env;
printf("%s\n", thisEnv);
}
cin.ignore();
cin.ignore();
return 0;
}
结果(我不会打印除一个以外的所有环境变量)......
Current compiler version is ... 1900
Current compiler full version is ... 190024215
Current OSVersion is ... Microsoft Windows NT 6.2.9200.0
...
OS=Windows_NT
上述测试程序配置为目标平台为10.0.14393.0
。
为什么我认为我的操作系统是Windows 8?
规格:
答案 0 :(得分:1)
这是设计使得GetVersionEx
和VerifyVersionInfo
函数在Windows 8.1或更高版本上为所有Win32桌面应用程序默认启用了“版本谎言”。
您可以通过向EXE添加包含正确兼容性GUID的嵌入式清单来控制“版本谎言”的应用程序:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>