Microsoft Visual Studio .NET 2003
 Microsoft DirectX 9.0 SDK (December 2004)

■DirectXランタイムがリテールモードのときのみ実行可能にする Prev  Top  Next

DirectXランタイムにはデバックモードとリテールモードがあります。この2つはそれぞれ次のような特徴があります。

  • デバックモード
      エラーチェックを厳密に行います。エラーチェックをする分実行時の動作が低速になります。開発時に使用します。

  • リテールモード
      エラーチェックをほとんど行いません。その分実行速度が高速になります。リリース時に使用します。

    ランタイムのみインストールされている環境ではリテールになっているはずですが、ゲームの開発などを行う環境ではSDKがインストールされているため デバックモードとリテールモードが切り替えられるようになっています。でデバックモードのときは動作が低速になるので、このときは実行できないようにするというのが今回の目的です。

    まあ必須ではないですがデバックモードで実行しておいて、遅い!!などといわれるのは嫌なので。(笑)

    ---main.cpp---

    
    //m_pd3dDeviceとm_d3dParametersは初期化済みとする
    //LPDIRECT3DDEVICE9 m_pd3dDevice;
    //D3DPRESENT_PARAMETERS m_d3dParameters;
    
    //ウィンドウ作成時に使用したウィンドウハンドル
    static HWND HWnd;
    
    //ウィンドウの表示位置を格納する。
    static RECT WindowPos;
    
    int APIENTRY WinMain( HINSTANCE hInstance,
                          HINSTANCE /*hPrevInstance*/,
                          LPSTR     /*lpCmpLine*/,
                          INT       /*nCmdShow*/)
    {
       int nWidth = 640;
       int nHeight = 480;
       DWORD WindowStyle;
       RECT DesctopRc;
       
       //****************************************************************
       //ここでウィンドウクラスの登録処理を行う。
       //****************************************************************
    
       
       //****************************************************************
       //ウィンドウの作成処理
       //****************************************************************
    
    
       //****************************************************************
       //ここでDirect3Dの初期化を行う。
       //****************************************************************
       
       
       //****************************************************************
       //ランタイムモードのチェック
       //****************************************************************      
       //リリースコンパイルのときはDirect3Dランタイムがリテールモードのときのみ実行可能とする。
    #ifndef _DEBUG
       //ランタイムのモードをチェックする。
       IDirect3DQuery9** ppQuery = NULL;
       hr = m_pd3dDevice->CreateQuery( D3DQUERYTYPE_VERTEXSTATS, ppQuery );
       if( SUCCEEDED( hr ) )
       {
          ::MessageBox( HWnd, "Direct3Dランタイムがデバックモードです。リテールモードに変更してください。", "実行時エラー", MB_OK );
          ::DestroyWindow( HWnd );
          return 0;
       }
    #endif
       
    
       //****************************************************************
       //ここでメッセージループ処理を行う。
       //****************************************************************
       
       
    }
    

    ソースは前回の続きです。これにDirect3Dの初期化の後にランタイムのチェックをするコードを追加します。

    開発時にはコンパイラをデバックコンパイルに設定しているはずなのでこのときはチェックしないようにします。
    リリース時にはコンパイラをリリースコンパイルに変更してコンパイルしてください。

    次にチェック方法ですが、IDirect3DDevice9::CreateQueryを使用してチェックします。 このメソッドは、本来は違う目的で使用するのですがデバッグモード専用のメソッドのため、リテールモードで使用するとエラーになります。なのでこれを使用します。
    IDirect3DDevice9::CreateQueryについて詳しく知りたい方はオンラインドキュメントを参照してください。

    なお、例によってエラーチェックはやってないのでソースを組み込むときは追加してください。

    Prev  Top  Next inserted by FC2 system