Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Plattformar
klienter – Windows 8.1
servrar – Windows Server 2012 R2
Beskrivning
Vi har gjort några betydande ändringar i hur Api:erna för GetVersion (ex) fungerar i Windows 8.1 på grund av oönskade kundbeteenden till följd av hur Api:erna för GetVersion (ex) har använts tidigare.
I tidigare versioner av Windows skulle anrop av GetVersion(Ex)-API:erna returnera den faktiska versionen av operativsystemet (OS), såvida inte processen hade modifierats av en appkompatibilitet-shim för att ge processen en annan version. Detta gjordes preliminärt och var ganska ofullständigt vad gäller antalet processer som Microsoft med rätta kunde inpassa i en utgåva. Många program föll genom sprickorna eftersom de inte blev shimmed på grund av dåligt utformade versionskontroller.
Den främsta anledningen till att göra en versionskontroll är att varna användaren om att programmet måste köras på en nyare version av operativsystemet. Men på grund av dåliga kontroller skulle appar ofta felaktigt varna för att de behövde köras på Windows XP eller senare, vilket naturligtvis är det nyaste operativsystemet. Oftast skulle det nyaste operativsystemet köra programmet utan problem om inte för dessa kontroller.
Manifestation
I Windows 8.1 och senare har API:erna för GetVersion (ex) blivit inaktuella. Det innebär att även om du fortfarande kan anropa dessa API-funktioner, så returnerar funktionerna Windows 8-versionen (6.2) om din app inte specifikt riktar in sig på Windows 8.1.
Lösning
Lägga till ett appmanifest
För att appen ska kunna rikta in sig på Windows 8.1 måste du inkludera ett -appmanifest (körbar) för appens körbara fil. I avsnittet <kompatibilitet> i manifestet måste du sedan lägga till ett <supportedOS>-element för att deklarera att appen stöder varje Windows-version.
I följande exempel visas en appmanifestfil för en app som stöder alla versioner av Windows från Windows Vista till 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>
Raden ovan markerad * ADD THIS LINE * visar hur du korrekt riktar in ditt program för Windows 8.1.
Att deklarera stöd för Windows 8.1 i appmanifestet kommer inte att ha någon effekt när du kör appen på tidigare operativsystem.
Använda VersionHelpers i stället för GetVersion(ex)
Windows 8.1 introducerar nya ersättnings-API-funktioner för GetVersion (t.ex. VersionHelpers). De är mycket lätta att använda; Allt du behöver göra är att #include <VersionHelpers.h>. Med de infogade funktionerna i huvudfilen VersionHelpers.h kan koden fråga om operativsystemet är en viss version av Windows eller senare.
Exempel Om programmet till exempel kräver Windows 8 eller senare använder du följande test:
#include <windows.h>
#include <VersionHelpers.h>
// ...
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
De tillgängliga Funktionerna i VersionHelper-API:et är:
#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();
De returnerar TRUE eller FALSE beroende på vilken fråga du ställer och du behöver bara definiera det operativsystem på lägsta nivå som du stöder.