バージョン チェック
バージョン チェック
アプリケーションでは、システムで現在利用可能な 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;
}