Condividi tramite


Modifiche della versione del sistema operativo in Windows 8.1 e Windows Server 2012 R2

Piattaforme

Client - Windows 8.1

Server - Windows Server 2012 R2

Descrizione

Sono state apportate alcune modifiche significative nel funzionamento delle API GetVersion(Ex) in Windows 8.1 a causa di comportamenti indesiderati dei clienti derivanti dal modo in cui le API GetVersion(Ex) sono state usate in passato.

Nelle versioni precedenti di Windows, la chiamata alle API GetVersion(Ex) restituiva la versione effettiva del sistema operativo, a meno che il processo non fosse stato mitigato da uno shim di compatibilità dell'app per assegnare una versione diversa. Questa operazione è stata eseguita provvisoriamente ed è stata relativamente incompleta in termini di numero di processi che Microsoft potrebbe ragionevolmente eseguire shim in una versione. Molte applicazioni sono cadute attraverso le crepe perché non sono state sottoposte a shim a causa di controlli delle versioni non progettati correttamente.

Il motivo principale per eseguire un controllo della versione consiste nell'avvisare l'utente che l'applicazione deve essere eseguita in una versione più recente del sistema operativo. Tuttavia, a causa di controlli scarsi, le app spesso avvisano erroneamente che devono essere eseguite in Windows XP o versioni successive, che naturalmente il sistema operativo più recente è. Più spesso, il sistema operativo più recente eseguirà l'applicazione senza problemi se non per questi controlli.

Manifestazione

In Windows 8.1 e versioni successive le API GetVersion(Ex) sono deprecate. Ciò significa che anche se puoi comunque chiamare queste funzioni API, se la tua app non è specificamente destinato a Windows 8.1, le funzioni restituiranno la versione di Windows 8 (6.2).

Soluzione

Aggiunta di un manifesto dell'app

Per fare in modo che l'app sia destinata a Windows 8.1, dovrai includere un manifesto dell'app (eseguibile) per l'eseguibile dell'app. Quindi, nella <sezione compatibilità> del manifesto, dovrai aggiungere un <elemento supportedOS> per ogni versione di Windows che vuoi dichiarare che l'app supporta.

L'esempio seguente mostra un file manifesto dell'app per un'app che supporta tutte le versioni di Windows da 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 riga precedente contrassegnata * ADD THIS LINE * mostra come specificare in modo accurato l'applicazione per Windows 8.1.

La dichiarazione del supporto per Windows 8.1 nel manifesto dell'app non avrà alcun effetto durante l'esecuzione dell'app nei sistemi operativi precedenti.

Uso di VersionHelpers invece di GetVersion(Ex)

Windows 8.1 introduce nuove funzioni API sostitutive per GetVersion(Ex), note come VersionHelpers. Sono estremamente facili da usare; tutto quello che devi fare è #include <VersionHelpers.h>. Le funzioni inline disponibili nel file di intestazione VersionHelpers.h consentono al codice di chiedere se il sistema operativo è una determinata versione di Windows o versione successiva.

Ad esempio , se l'applicazione richiede Windows 8 o versione successiva, usare il test seguente:

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

Le funzioni API VersionHelper disponibili sono:

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

Restituiscono TRUE o FAL edizione Standard a seconda della domanda che stai chiedendo e devi definire solo il sistema operativo di livello minimo supportato.

Risorse