Microsoft DirectX 8.0 (C++)

オペレーティング システムのバージョンのチェック

アプリケーションでは、Microsoft® DirectX® のバージョンだけでなく、それが実行されているオペレーティング システムやインストールされているサービス パックの情報が必要になる場合がある。オペレーティング システムのバージョンを調べるには、Microsoft Windows® 関数の GetVersionEx を使用するとよい。この関数は、次の各種情報を含む OSVERSIONINFO 構造体を返す。

アプリケーションが対応している最も古いオペレーティング システムについて調べるのが一般的である。そのバージョン以降がインストールされていれば、インストールしたアプリケーションは正常に実行される。

  GetVersionEx によって返されるオペレーティング システム情報は、DirectX の存在またはバージョン番号を調べるテストには使用できない。特に、システムが Windows NT ベースであるからといって、DirectX が存在しないとは限らない。たとえば、Windows 2000 オペレーティング システムには DirectX 7.0 以降が含まれている。Windows NT ベースのオペレーティング システムの今後のバージョンでも、DirectX のバージョンが含まれるものと予測される。DirectX の存在とバージョン番号は、前のトピックで説明した手順で調べる必要がある。

次のサンプル関数は、GetVersionEx を使ってオペレーティング システムのバージョンをテストする方法を示している。インストールされているバージョンがパラメータ リストに指定されているバージョン以降であれば、関数は TRUE を返す。この場合、インストールしたアプリケーションは正常に実行される。それ以外の場合、関数は FALSE を返す。これは、アプリケーションをインストールしても正しく実行されないことを意味する。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

BOOL bIsWindowsVersionOK(   DWORD dwWin9xMajor, DWORD dwWin9xMinor,
                            DWORD dwWinNTMajor, DWORD dwWinNTMinor, WORD wWinNTSPMajor )
{
    OSVERSIONINFO           osvi;
    
    // OSVERSIONINFO 構造体を初期化する。
    ZeroMemory( &osvi, sizeof( osvi ) );
    osvi.dwOSVersionInfoSize = sizeof( osvi );
        
    GetVersionEx( &osvi );  // この関数が成功したと仮定する。

    // コードのパスを NT の場合と Win9x の場合に分ける。
    if( osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
    {
        // メジャー バージョンをチェックする。
        if( osvi.dwMajorVersion > dwWin9xMajor )
            return TRUE;
        else if( osvi.dwMajorVersion == dwWin9xMajor )
        {
            // マイナー バージョンをチェックする。
            if( osvi.dwMinorVersion >= dwWin9xMinor )
                return TRUE;
        }
    }
    else if( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT )
    {
        // メジャー バージョンをチェックする。
        if( osvi.dwMajorVersion > dwWinNTMajor )
            return TRUE;
        else if( osvi.dwMajorVersion == dwWinNTMajor )
        {
            // マイナー バージョンをチェックする。
            if( osvi.dwMinorVersion > dwWinNTMinor )
                return TRUE;
            else if( osvi.dwMinorVersion == dwWinNTMinor )
            {
                // サービス パックをチェックする。
                DWORD dwServicePack = 0;

                if( osvi.szCSDVersion )
                {
                    _stscanf(   osvi.szCSDVersion,
                                _T("Service Pack %d"),
                                &dwServicePack );
                }
                return ( dwServicePack >= wWinNTSPMajor );
            }
        }
    }
    return FALSE;
}