Cambios en la versión del sistema operativo en Windows 8.1 y Windows Server 2012 R2
Plataformas
Clientes: Windows 8.1
Servidores: Windows Server 2012 R2
Descripción
Hemos realizado algunos cambios significativos en la forma en que funcionan las API getVersion(Ex) en Windows 8.1 debido a comportamientos de cliente no deseados resultantes de cómo se han usado las API GetVersion(Ex) en el pasado.
En versiones anteriores de Windows, al llamar a las API GetVersion(Ex) se devolvería la versión real del sistema operativo (SO), a menos que el proceso se hubiera mitigado mediante una compatibilidad de aplicación para darle una versión diferente. Esto se realizó provisionalmente y fue relativamente incompleto en términos del número de procesos que Microsoft podría regularmente en una versión. Muchas aplicaciones se han caído por las grietas porque no se han corregido debido a comprobaciones de versiones mal diseñadas.
El motivo número uno para realizar una comprobación de versión es advertir al usuario de que la aplicación debe ejecutarse en una versión más reciente del sistema operativo. Sin embargo, debido a comprobaciones deficientes, las aplicaciones a menudo advertirían incorrectamente de que necesitaban ejecutarse en Windows XP o versiones posteriores, que por supuesto el sistema operativo más reciente es. Con más frecuencia que no, el sistema operativo más reciente ejecutaría la aplicación sin problemas si no para estas comprobaciones.
Manifestación
En Windows 8.1, las API GetVersion(Ex) han quedado en desuso. Esto significa que, aunque todavía puede llamar a estas funciones de API, si la aplicación no tiene como destino específicamente Windows 8.1, las funciones devolverán la versión de Windows 8 (6.2).
Solución
Adición de un manifiesto de aplicación
Para que la aplicación tenga como destino Windows 8.1, deberá incluir un manifiesto de aplicación (ejecutable) para el ejecutable de la aplicación. A continuación, en la <sección de compatibilidad> del manifiesto, deberá agregar un <elemento supportedOS> para cada versión de Windows que quiera declarar que la aplicación admite.
En el ejemplo siguiente se muestra un archivo de manifiesto de aplicación para una aplicación que admite todas las versiones de Windows de Windows Vista a 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>
La línea anterior marcada * ADD THIS LINE *
muestra cómo dirigirse con precisión a la aplicación para Windows 8.1.
La declaración de compatibilidad con Windows 8.1 en el manifiesto de la aplicación no tendrá ningún efecto al ejecutar la aplicación en sistemas operativos anteriores.
Usar VersionHelpers en lugar de GetVersion(Ex)
Windows 8.1 presenta nuevas funciones de API de reemplazo para GetVersion(Ex), conocidas como VersionHelpers. Son extremadamente fáciles de usar; todo lo que tiene que hacer es #include <VersionHelpers.h>
. Las funciones insertadas disponibles en el archivo de encabezado VersionHelpers.h permiten al código preguntar si el sistema operativo es una versión determinada de Windows o posterior.
Ejemplo Por ejemplo, si la aplicación requiere Windows 8 o posterior, use la prueba siguiente:
#include <VersionHelpers.h>
// ...
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
Las funciones disponibles de la API VersionHelper son:
#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();
Devolverán TRUE o FALSE en función de la pregunta que esté preguntando, y solo tendrá que definir el sistema operativo de nivel mínimo que admita.