Platform SDK: DirectX |
ユーザーのシステムで現在実行中の DirectX のバージョンにおける機能を調整するために、アプリケーション側で現在インストールされている DirectX のバージョンを確認しなければならない場合がある。
DirectX ソフトウェア開発キットには、(SDK ルート) \Samples\Multimedia\DXMisc\Src\GetDXVer にソース コード付きのサンプル アプリケーションが用意されている。これはシステムに DirectX が存在するかどうかを確認し、DirectX が存在する場合にはそのバージョンを確認する。各 DirectX の新しいバージョンは以前のバージョンの機能をすべてサポートするが、アプリケーションが将来的なバージョンでも動作するよう、特定のバージョンまたはそれ以降のバージョンで必ずテストすること。
また、QueryInterface を使って特定の機能をテストすることもできる。たとえば、アプリケーション全般は DirectX 3.0 以降のバージョンで動作するように設計されているが、オプションのフォース フィードバック エフェクトが DirectX 5.0 以降のバージョンだけでサポートされるとする。この場合、IDirectInputDevice インターフェイスを取得してから IDirectInputDevice2 に問い合わせることにより、フォース フィードバックがサポートされるかどうかを確認できる。
さまざまな理由から、アプリケーション側で現在実行されているオペレーティング システムのバージョンの確認が必要な場合もある。コンポーネントや Windows オペレーティング システムの将来のバージョンに容易に移行できるようにするには、アプリケーションが対応する最も古いバージョンを確認し、それ以降のバージョンでのインストールと実行を行えるようにする。Windows 2000 には DirectX 7.0 の機能またはそれ以上のものが備えられているので、開発者は Windows 2000 またはそれ以上のものを検出し、検出された場合はそこでアプリケーションが動作するようなコードを記述する必要がある。逆に、検出されたバージョンが Windows NT 4.0 の場合、DirectX 7.0 の機能は利用できない。
次のサンプル関数は、オペレーティング システムがパラメータの示すバージョン (メジャー バージョン、マイナー バージョン、サービス パック) と同じ、またはそれ以降の場合に TRUE を返す。
BOOL bIsWindowsVersionOK(DWORD dwMajor, DWORD dwMinor, WORD dwSPMajor) { OSVERSIONINFO osvi; // OSVERSIONINFO 構造体を初期化する。// ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osvi); // メジャー バージョンをチェックする。 if (osvi.dwMajorVersion > dwMajor) return TRUE; else if (osvi.dwMajorVersion == dwMajor) { // マイナー バージョンをチェックする。 if (osvi.dwMinorVersion > dwMinor) return TRUE; else if (osvi.dwMinorVersion == dwMinor) { // サービス パックをチェックする。 if (dwSPMajor && osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) { HKEY hKey; DWORD dwCSDVersion; DWORD dwSize; BOOL fMeetsSPRequirement = FALSE; if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Windows", 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { dwSize = sizeof(dwCSDVersion); if (RegQueryValueEx (hKey, "CSDVersion", NULL, NULL, (unsigned char*)&dwCSDVersion, &dwSize) == ERROR_SUCCESS) { fMeetsSPRequirement = (LOWORD(dwCSDVersion) >= dwSPMajor); } RegCloseKey(hKey); } return fMeetsSPRequirement; } return TRUE; } } return FALSE; }