Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Plataformas
Clientes: servidores de Windows 8.1: Windows Server 2012 R2
Descripción
Hemos realizado algunos cambios significativos en cómo 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 mostrar algún mensaje de compatibilidad con el sistema operativo para la aplicación. Sin embargo, debido a las comprobaciones deficientes, el mensaje a menudo mostraría que la aplicación necesitaba ejecutarse en XP o posterior, 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 puedes llamar a las API, si la aplicación no tiene como destino específicamente Windows 8.1, obtendrás Windows 8 control de versiones (6.2.0.0).
Solución
Para dirigirse a Windows 8.1, debe incluir el manifiesto de la aplicación o incluir _NT_TARGET_VERSION=$ (_NT_TARGET_VERSION_LATEST) en el archivo de origen.
Este es el aspecto que tendría el manifiesto de la aplicación:
<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=SXS_ASSEMBLY_NAME
version=SXS_ASSEMBLY_VERSION
processorArchitecture=SXS_PROCESSOR_ARCHITECTURE
/>
<description> my app exe </description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
* <!-- Windows 8.1 -->
* <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
</assembly>
Y, a continuación, agréguelo a los orígenes:
SXS_MANIFEST_RESOURCE_ID=1 SXS_MANIFEST=foo.manifest SXS_ASSEMBLY_NAME=Microsoft.Windows.Foo SXS_ASSEMBLY_VERSION=1.0 SXS_ASSEMBLY_LANGUAGE_INDEPENDENT=1 SXS_MANIFEST_IN_RESOURCES=1 Para Windows 8.1, las dos líneas anteriores marcadas con un asterisco (*) muestran cómo dirigirse con precisión a la aplicación para la versión Windows 8.1 del sistema operativo. Al manifestar el .exe para Windows 8.1 no tendrá ningún impacto cuando se ejecute en sistemas operativos anteriores. También puede agregarlo al archivo .rc si ya lo ha definido.
Agregar trustInfo no es esencial, pero se recomienda encarecidamente. Esto permitirá que el .exe obtenga siempre la versión correcta, independientemente de si el sistema operativo está Windows 8.1 o Windows 8.
Las API de reemplazo se conocen como VersionHelpers. Son extremadamente fáciles de usar; todo lo que tiene que hacer es #include <VersionHelpers.h>.
Ejemplo
Las funciones insertadas disponibles en el archivo de encabezado VersionHelpers.h permiten comprobar la versión del sistema operativo devolviendo un valor booleano al probar la versión de Windows. 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 API disponibles 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 IsWindows8_1OrGreater() VERSIONHELPERAPI IsWindowsServer() Devolverá TRUE o FALSE en función de la pregunta que esté haciendo y solo necesita definir el sistema operativo de nivel mínimo que admita.