Compartilhar via


Alterações de versão do sistema operacional no Windows 8.1 e Windows Server 2012 R2

Plataformas

Clientes - Windows 8.1

Servidores - Windows Server 2012 R2

Descrição

Fizemos algumas alterações significativas em como as APIs GetVersion(Ex) funcionam no Windows 8.1 devido a comportamentos indesejáveis do cliente resultantes de como as APIs GetVersion(Ex) foram usadas no passado.

Em versões anteriores do Windows, chamar as APIs GetVersion(Ex) retornaria a versão real do sistema operacional (SO), a menos que o processo tivesse sido atenuado por um aplicativo compat shim para dar-lhe uma versão diferente. Isso foi feito em uma base provisória e foi relativamente incompleto em termos do número de processos que a Microsoft poderia razoavelmente corrigir em um lançamento. Muitos aplicativos caíram nas rachaduras porque não ficaram arrepiados devido a verificações de versão mal projetadas.

A razão número um para fazer uma verificação de versão é avisar o usuário que o aplicativo precisa ser executado em uma versão mais recente do sistema operacional. No entanto, devido a verificações ruins, os aplicativos muitas vezes avisavam incorretamente que precisavam ser executados no Windows XP ou posterior, o que, é claro, é o sistema operacional mais recente. Na maioria das vezes, o sistema operacional mais recente executaria o aplicativo sem problemas, se não fossem essas verificações.

Manifestação

No Windows 8.1 e posterior, as APIs GetVersion(Ex) foram preteridas. Isso significa que, embora você ainda possa chamar essas funções de API, se seu aplicativo não se destinar especificamente ao Windows 8.1, as funções retornarão a versão do Windows 8 (6.2).

Solução

Adicionando um manifesto de aplicativo

Para que seu aplicativo tenha como destino o Windows 8.1, você precisará incluir um manifesto do aplicativo (executável) para o executável do aplicativo. Em seguida, na <seção de compatibilidade> do manifesto, você precisará adicionar um< elemento supportedOS> para cada versão do Windows que você deseja declarar que seu aplicativo oferece suporte.

O exemplo a seguir mostra um arquivo de manifesto de aplicativo para um aplicativo que oferece suporte a todas as versões do Windows do Windows Vista para o Windows 8.1:

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

A linha acima marcada * ADD THIS LINE * mostra como direcionar com precisão seu aplicativo para o Windows 8.1.

Declarar suporte para o Windows 8.1 no manifesto do aplicativo não terá efeito ao executar o aplicativo em sistemas operacionais anteriores.

Usando VersionHelpers em vez de GetVersion(Ex)

O Windows 8.1 introduz novas funções de API de substituição para GetVersion(Ex), conhecidas como VersionHelpers. São extremamente fáceis de usar; tudo o que você precisa fazer é #include <VersionHelpers.h>. As funções embutidas disponíveis no arquivo de cabeçalho VersionHelpers.h permitem que seu código pergunte se o sistema operacional é uma determinada versão do Windows ou posterior.

Exemplo Por exemplo, se seu aplicativo requer o Windows 8 ou posterior, use o seguinte teste:

#include <windows.h>
#include <VersionHelpers.h>
// ...
    if (!IsWindows8OrGreater())
    {
       MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
    }

As funções disponíveis da API VersionHelper são:

#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();

Eles retornarão VERDADEIRO ou FALSO dependendo da pergunta que você está fazendo, e você só precisa definir o sistema operacional de nível mínimo que você suporta.

Recursos