플랫폼
클라이언트 - Windows 8.1
서버 - Windows Server 2012 R2
설명
GetVersion(Ex) API가 과거에 사용된 방식에서 발생하는 바람직하지 않은 고객 동작으로 인해 Windows 8.1에서 GetVersion(Ex) API가 작동하는 방식에 몇 가지 중요한 변경 사항이 적용되었습니다.
이전 버전의 Windows에서 GetVersion(Ex) API를 호출하면 다른 버전을 제공하기 위해 앱 compat shim에서 프로세스를 완화하지 않는 한 OS(운영 체제)의 실제 버전이 반환됩니다. 이 작업은 임시적인 방식으로 수행되었으며, Microsoft가 릴리스에서 합리적으로 호환되도록 조정할 수 있는 프로세스 수 측면에서 상대적으로 불완전했습니다. 많은 애플리케이션이 잘못 설계된 버전 검사로 인해 고려되지 않아, 누락되어 버렸습니다.
버전 검사를 수행하는 가장 큰 이유는 최신 버전의 OS에서 애플리케이션을 실행해야 한다는 경고입니다. 그러나 잘못된 검사로 인해 앱은 Windows XP 이상에서 실행해야 한다고 잘못 경고하는 경우가 많으며, 이는 물론 최신 OS입니다. 최신 OS는 이러한 검사가 아닌 경우 문제 없이 애플리케이션을 실행하는 경우가 많습니다.
발현
Windows 8.1 이상에서는 GetVersion(Ex) API가 더 이상 사용되지 않습니다. 즉, 이러한 API 함수를 계속 호출할 수 있지만 앱이 특별히 Windows 8.1을 대상으로 하지 않는 경우 함수는 Windows 8 버전(6.2)을 반환합니다.
해결책
앱 매니페스트 추가
앱이 Windows 8.1을 대상으로 하려면 앱의 실행 파일에 대한 앱(실행 파일) 매니페스트 포함해야 합니다. 매니페스트의 <호환성> 섹션 안에, 앱이 지원한다고 선언하고자 하는 각 Windows 버전에 대해 <supportedOS> 요소를 추가해야 합니다.
다음 예제에서는 Windows Vista에서 Windows 8.1까지 모든 버전의 Windows를 지원하는 앱의 앱 매니페스트 파일을 보여 줍니다.
<!-- example.exe.manifest -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity
type="win32"
name="Contoso.ExampleApplication.ExampleBinary"
version="1.2.3.4"
processorArchitecture="x86"
/>
<description>Contoso Example Application</description>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- * ADD THIS LINE * -->
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
</application>
</compatibility>
</assembly>
위의 표시된 * ADD THIS LINE * Windows 8.1용 애플리케이션을 정확하게 대상으로 지정하는 방법을 보여 줍니다.
이전 운영 체제에서 앱을 실행할 때 앱 매니페스트에서 Windows 8.1에 대한 지원을 선언해도 아무런 영향을 주지 않습니다.
GetVersion(예) 대신 VersionHelpers 사용
Windows 8.1에는 VersionHelpers라고 하는 GetVersion(Ex)에 대한 새로운 대체 API 함수가 도입되었습니다. 사용하기 매우 쉽습니다. 따라서 해야 할 일은 #include <VersionHelpers.h>입니다. VersionHelpers.h 헤더 파일에서 사용할 수 있는 인라인 함수를 사용하면 코드에서 운영 체제가 지정된 버전의 Windows 이상인지 여부를 확인할 수 있습니다.
예제 예를 들어 애플리케이션에 Windows 8 이상이 필요한 경우 다음 테스트를 사용합니다.
#include <windows.h>
#include <VersionHelpers.h>
// ...
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
사용 가능한 VersionHelper API 함수는 다음과 같습니다.
#define VERSIONHELPERAPI FORCEINLINE BOOL
VERSIONHELPERAPI IsWindowsXPOrGreater();
VERSIONHELPERAPI IsWindowsXPSP1OrGreater();
VERSIONHELPERAPI IsWindowsXPSP2OrGreater();
VERSIONHELPERAPI IsWindowsXPSP3OrGreater();
VERSIONHELPERAPI IsWindowsVistaOrGreater();
VERSIONHELPERAPI IsWindowsVistaSP1OrGreater();
VERSIONHELPERAPI IsWindowsVistaSP2OrGreater();
VERSIONHELPERAPI IsWindows7OrGreater();
VERSIONHELPERAPI IsWindows7SP1OrGreater();
VERSIONHELPERAPI IsWindows8OrGreater();
VERSIONHELPERAPI IsWindows8Point1OrGreater();
VERSIONHELPERAPI IsWindowsServer();
질문하는 질문에 따라 TRUE 또는 FALSE를 반환하며 지원되는 최소 수준 운영 체제만 정의하면 됩니다.