次の方法で共有


バージョン チェック

バージョン チェック

アプリケーションでは、システムで現在利用可能な Microsoft® DirectX® のバージョン情報が必要になる場合がある。たとえば、システムに古いバージョンの DirectX が存在する場合、アプリケーションはそのバージョンに機能の範囲を合わせるか、最新のバージョンをインストールする必要が生じることがある。

DirectX 9.0 では、次のオペレーティング・システムをサポートしている。表は、各オペレーティング・システムに付属する DirectX のバージョンを示している。

オペレーティング システム DirectX のバージョン
Microsoft Windows® 98 Gold DirectX 5.2
Windows 98 SE DirectX 6.1a
Windows 2000 DirectX 7.0
Windows Millennium Edition (Windows Me) DirectX 7.1
Windows XP DirectX 8.1

DirectX のバージョン番号を直接取得する方法はない。ただし、各バージョンは、固有のオブジェクトおよびインターフェイスを含んでいる。DirectX のすべてのバージョンは、以前のすべてのバージョンをサポートしている。このため、特定のバージョン固有のインターフェイスおよびオブジェクトは、それらを導入したバージョンとすべての後続バージョンでサポートされる。したがって、必要なバージョンが利用可能かどうかを調べるには、そのバージョン固有のオブジェクトまたはインターフェイスが存在するかどうかをテストするとよい。それらのオブジェクトまたはインターフェイスが存在する限り、それよりも新しいバージョンの DirectX を使っていても、アプリケーションは正常に機能する。

たとえば、DirectX 6.1 のサポートが必要であるとする。Microsoft DirectMusic® オブジェクト (CLSID_DirectMusic) は、DirectX 6.1 から導入されたオブジェクトである。DirectMusic オブジェクトの存在は、CoCreateInstance を使ってこのオブジェクトの作成を試みることでテストできる。成功した場合は、バージョン 6.1 以降がインストールされているので、DirectX 6.1 のすべての機能を使える。

ここでは、各バージョン固有のインターフェイスおよびオブジェクトの詳細なリストは示さないので、DirectX ソフトウェア開発キット (SDK) のサンプルのセクションを参照すること。サンプルの 1 つの GetDXVersion という関数には、DirectX のすべてのバージョンに関するテストが含まれている。GetDXVersion は、そのシステムに存在する DirectX のバージョンに対応する整数を返す。この整数が必要なバージョンの番号と同じであるか、それよりも大きければ、アプリケーションは正常に動作する。サンプル コードは、SDK のルート フォルダの \Samples\Multimedia\DXMisc\GetDXVer にある。

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

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

  • システムが Microsoft Windows NT® ベースか Windows 95 以降ベースか
  • メジャー バージョン番号およびマイナー バージョン番号
  • サービス パック番号 (Windows NT ベースのシステムの場合)

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

  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;
    
    // Initialize the OSVERSIONINFO structure.

    ZeroMemory( &osvi, sizeof( osvi ) );
    osvi.dwOSVersionInfoSize = sizeof( osvi );

    GetVersionEx( &osvi );  // Assume this function succeeds.

    // Split code paths for NT and Windows 9x    
    if( osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
    {
        // Check the major version.
        if( osvi.dwMajorVersion > dwWin9xMajor )
            return TRUE;

        else if( osvi.dwMajorVersion == dwWin9xMajor )
        {
            // Check the minor version.
            if( osvi.dwMinorVersion >= dwWin9xMinor )
                return TRUE;
        }
    }

    else if( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT )
    {
        // Check the major version.
        if( osvi.dwMajorVersion > dwWinNTMajor )
            return TRUE;

        else if( osvi.dwMajorVersion == dwWinNTMajor )
        {
            // Check the minor version.
            if( osvi.dwMinorVersion > dwWinNTMinor )
                return TRUE;

            else if( osvi.dwMinorVersion == dwWinNTMinor )
            {
                // Check the service pack.

                DWORD dwServicePack = 0;

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