Windows 8.1 および Windows Server 2012 R2 におけるオペレーティング システム バージョンの変更

プラットフォーム

クライアント - Windows 8.1

サーバー - Windows Server 2012 R2

説明

GetVersion(Ex) API の以前の使用方法によって望ましくないお客様の行動が引き起こされたことにより、Windows 8.1 における GetVersion(Ex) API の動作方法について、いくつかの重要な変更が行われました。

以前のバージョンの Windows では、GetVersion(Ex) API を呼び出すと、アプリ コンパクト シムによってプロセスが軽減されて別のバージョンが提供されない限り、オペレーティング システム (OS) の実際のバージョンが返されます。 これは暫定的に行われていたものであり、Microsoft がリリースで合理的にシムによる修正ができるプロセスの数に関しては比較的不完全でした。 設計が不十分なバージョンの確認が原因によるシム修正が行われないことで、多くのアプリケーションがクラックを経験しました。

バージョンの確認を行う第 1 の理由は、新しいバージョンの OS でアプリケーションを実行することが必要であることをユーザーに警告することです。 ただし、確認不良により、より最新の OS であるべきところを Windows XP 以降で実行する必要があると誤ってアプリによって警告される場合がよくあります。 多くの場合、最新の OS では、これらの確認がなければ問題なくアプリケーションが実行されます。

マニフェスト

Windows 8.1 以降では、GetVersion(Ex) API は非推奨になりました。 つまり、これらの API 関数は引き続き呼び出すことができますが、アプリが Windows 8.1 を特に対象としていない場合、この関数は Windows 8 バージョン (6.2) を返します。

解決策

アプリ マニフェストの追加

アプリが Windows 8.1 を対象とするには、アプリの実行可能ファイルにアプリ (実行可能) マニフェストを含める必要があります。 続いて、マニフェストの<互換性>セクションで、アプリがサポートしていることを宣言する Windows バージョンごとに <supportedOS> 要素を追加する必要があります。

次の例は、Windows Vista から Windows 8.1 までのすべてのバージョンの Windows をサポートするアプリのアプリ マニフェスト ファイルを示します。

<!-- 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>

* ADD THIS LINE * でマークされた上記の行は、アプリケーションが正確に Windows 8.1 を対象とする方法を示しています。

アプリ マニフェストで Windows 8.1 のサポートを宣言しても、以前のオペレーティング システムにおけるアプリの実行には影響はありません。

GetVersion(Ex) の代わりに VersionHelpers を使用する

Windows 8.1 には、VersionHelpers と呼ばれる GetVersion(Ex) の新しい置換 API 関数が導入されています。 これは非常に使いやすく、#include <VersionHelpers.h> を行うだけで済みます。 VersionHelpers.h ヘッダー ファイルで使用できるインライン関数を使用すると、オペレーティング システムが特定のバージョンの Windows 以降であるかをコードで確認できます。

たとえば、アプリケーションで Windows 8 以降が必要な場合は、次のテストを使用します:

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

使用可能な VersionHelper API 関数は次のとおりです。

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

質問に応じて TRUE または FALSE が返され、サポートする最小レベルのオペレーティング システムを定義することのみが必要となります。

リソース