2017-11-10 1 views
-1

내 개발 컴퓨터에서 Windows 10을 실행 중입니다. 10. Tried this의 주요 버전을 반환하도록 OS 버전을 얻으려고 시도했으며 System::Environment::OSVersion->VersionString을 통해 환경 변수를 시도했습니다. 둘 다 Microsoft Windows NT 6.2.9200을 반환합니다. Windows 7 컴퓨터에서 실행 파일을 테스트하면 6.1.* (올바른)이 표시됩니다. 파워 쉘이 실행잘못된 버전을 반환하는 MSVC OSVersion

내가 올바른 결과를 얻을 : 나도 같은 환경 변수의 논리를 사용하여 Visual Studio에서 테스트 C++ 프로그램을 작성

PS Z:\> [System.Environment]::OSVersion.Version 

Major Minor Build Revision 
----- ----- ----- -------- 
10  0  14393 0 

...

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

이 결과를 (I 하나를 제외한 모든 환경 변수를 출력하지 않습니다.) ...

Current compiler version is ... 1900 
Current compiler full version is ... 190024215 
Current OSVersion is ... Microsoft Windows NT 6.2.9200.0 

... 
OS=Windows_NT 

위의 테스트 p 프로그램은 대상 플랫폼이 10.0.14393.0으로 구성됩니다.

내 OS가 Windows 8이라고 생각하는 이유는 무엇입니까?

사양 :

  • 윈도우 10
  • 버전 10.0.14393 14,393
  • 비주얼 스튜디오 2015 (C++ 프로젝트)
    • 대상 플랫폼 10.0.14393.0
  • PowerShell을 구축 버전 5.1
+0

['네임 스페이스를 사용하여 표준; ' 나쁜 습관] (https://stackoverflow.com/q/1452721/2176813), 절대로 사용하지 마십시오. – tambre

+1

[app.manifest를 프로젝트에 추가하고 8.1 및 10에 대해 지원되는 OS GUID를 추가하십시오] (https://stackoverflow.com/a/40681525/1466046). 이제 작동합니다. – magicandre1981

+2

[C#의 Windows 10에서 최신 버전 OS 가져 오기] 가능한 복제본 (https://stackoverflow.com/questions/40672109/get-current-version-os-in-windows-10-in-c-sharp) – magicandre1981

답변

0

이것은 기본적으로 모든 Win32 데스크톱 응용 프로그램에 대해 Windows 버전 8.1 이상에서 '버전 거짓말'이 활성화되어 있으므로 GetVersionExVerifyVersionInfo 기능입니다.

당신은 적절한 호환성 GUID를 포함하여 EXE에 포함 된 매니페스트를 추가하여 '버전 거짓말'의 응용 프로그램을 제어합니다

<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> 

참조 MSDNManifest Madness

+0

Did 이건 작동하지만 경고를받습니다. (거짓말 인 것 같습니다) - 네임 스페이스 "urn : schemas-microsoft-com : compatibility.v1"에서'manifest authoring warning 81010002 : Unrecognized Element "compatibility" 호환성 태그가 실제로 작동하여 올바른 Windows 버전을 반환 할 수 있었기 때문에 거짓말이라고 주장합니다. 이것이 무엇인지, 또는 내가 그것을 어떻게 제거 할 수 있는지에 대한 어떤 생각입니까? –

+0

사용중인 매니페스트 도구 (''MT.EXE'')의 버전에 따라 다릅니다. 이 경고는 최근의 경고를 사용하는 경우에는 발생하지 않습니다. 프로젝트에서 도구 경로를 확인하여 사용중인 도구 경로를 파악하십시오. –

관련 문제