다음을 통해 공유


Windows 8.1 및 Windows Server 2012 R2의 운영 체제 버전 변경

플랫폼

클라이언트 - Windows 8.1

서버 - Windows Server 2012 R2

Description

GetVersion(Ex) API가 과거에 사용된 방식에서 발생하는 바람직하지 않은 고객 동작으로 인해 Windows 8.1 GetVersion(Ex) API가 작동하는 방식에 몇 가지 중요한 변경 사항이 적용되었습니다.

이전 버전의 Windows에서 GetVersion(Ex) API를 호출하면 다른 버전을 제공하기 위해 앱 호환 shim에 의해 프로세스가 완화되지 않은 한 실제 버전의 OS(운영 체제)가 반환됩니다. 이 작업은 임시로 수행되었으며 Microsoft가 릴리스에서 합리적으로 shim할 수 있는 프로세스 수 측면에서 상대적으로 불완전했습니다. 많은 애플리케이션이 제대로 디자인되지 않은 버전 검사로 인해 숨을 쉬지 않았기 때문에 균열을 겪었습니다.

버전 검사 수행하는 가장 큰 이유는 최신 버전의 OS에서 애플리케이션을 실행해야 한다는 경고입니다. 그러나 잘못된 검사로 인해 앱은 Windows XP 이상에서 실행해야 한다고 잘못 경고하는 경우가 많으며, 이는 물론 최신 OS입니다. 최신 OS는 이러한 검사가 아닌 경우 문제 없이 애플리케이션을 실행하는 경우가 많습니다.

형상

Windows 8.1 GetVersion(Ex) API는 더 이상 사용되지 않습니다. 즉, 이러한 API 함수를 계속 호출할 수 있지만 앱이 Windows 8.1 구체적으로 대상으로 지정하지 않으면 함수는 Windows 8 버전(6.2)을 반환합니다.

해결 방법

앱 매니페스트 추가

앱이 Windows 8.1 대상으로 지정하려면 앱의 실행 파일에 대한 앱(실행 파일) 매니페스트를 포함해야 합니다. 그런 다음 매니<페스트의 호환성> 섹션에서 앱이 지원하는 것을 선언하려는 각 Windows 버전에 대해 지원되는OS> 요소를 추가<해야 합니다.

다음 예제에서는 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(Ex) 대신 VersionHelpers 사용

Windows 8.1 VersionHelpers라고 하는 GetVersion(Ex)에 대한 새로운 대체 API 함수를 도입했습니다. 매우 사용하기 쉽습니다. 해야 할 일은 입니다 #include <VersionHelpers.h>. VersionHelpers.h 헤더 파일에서 사용할 수 있는 인라인 함수를 사용하면 코드에서 운영 체제가 지정된 버전의 Windows 이상인지 여부를 확인할 수 있습니다.

예제 예를 들어 애플리케이션에 Windows 8 이상이 필요한 경우 다음 테스트를 사용합니다.

#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를 반환하며 지원하는 최소 수준 운영 체제만 정의하면 됩니다.

리소스