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;
}