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.