DirectX診断ツール(DxDiag.exe)

  • DirectX診断ツール(DxDiag?.exe)はDirectXをインストールしていると使用可能なDirectX環境確認ツールです。
    このツールは「スタート→ファイル名を指定して実行→「dxdiag」と入力→実行」で起動します。
    いろいろな情報が表示されますが、情報がありすぎてわかりにくい状態です。
  • そこで、DirectX9 Toolのプログラムの中でも使用していますが、このDirectX診断ツールで取得可能な情報をプログラムから使用可能にするためのAPIを利用して簡略したバージョンを作成してみました。

PcInfo Program

  • インクルードするヘッダー等
    #include <dxdiag.h>    // dxdiagn.dll用ヘッダー
    #include <windows.h>	// Windows標準ヘッダー
    #include <stdio.h>	// 標準入出力ヘッダー
    #include <objbase.h>	// COM+インターフェイス
    private:
     #define AllowWHQLChecks		false;
     #define SAFE_DELETE(p)       { if(p) { delete (p);     (p)=NULL; } }
     #define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p);   (p)=NULL; } }
     #define SAFE_RELEASE(p)      { if(p) { (p)->Release(); (p)=NULL; } }
    protected:
     IDxDiagProvider*  m_pDxDiagProvider;
     IDxDiagContainer* m_pDxDiagRoot;

初期化

  • DxDiag?へはCOMインターフェイスを利用してアクセスする必要があるので 開始時に「CoInitialize?(NULL)」を実行します
  • DxDiag?のCOMインターフェイスは「IID_IDxDiagProvider?」です。
      ////////////////////////////////////////////////////////////////////////////////
      //  初期化
      ////////////////////////////////////////////////////////////////////////////////
      bool CDxDiagLib::Init(void)
      {
        HRESULT       hr;
        DXDIAG_INIT_PARAMS dxDiagInitParam;
    
        m_pDxDiagProvider = NULL;
        m_pDxDiagRoot = NULL;
        g_DxDiagInfo = NULL;
        g_DxSoundInfo = NULL;
    
        // COMライブラリを使用できるように初期化
        hr = CoInitialize(NULL);
        if (FAILED(hr))
        {
          return false;
        }
    
        hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER,
                               IID_IDxDiagProvider, (LPVOID*) &m_pDxDiagProvider);
        if( FAILED(hr) || m_pDxDiagProvider == NULL)
        {
          return false;
        }
    
        // DXDIAG_INIT_PARAMSを初期化
        ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) );
        dxDiagInitParam.dwSize                  = sizeof(DXDIAG_INIT_PARAMS);
        dxDiagInitParam.dwDxDiagHeaderVersion   = DXDIAG_DX9_SDK_VERSION;
        // WHQLを確認するかどうか
        // ネットを経由するので基本的にはfalseにしておく
        dxDiagInitParam.bAllowWHQLChecks        = AllowWHQLChecks;
        dxDiagInitParam.pReserved               = NULL;
    
        hr = m_pDxDiagProvider->Initialize( &dxDiagInitParam );
        if( FAILED(hr) )
        {
          return false;
        }
    
        hr = m_pDxDiagProvider->GetRootContainer( &m_pDxDiagRoot );
        if( FAILED(hr) )
        {
          return false;
        }
    
        return true;
      }
    

取得方法の見本

  • 結果が「VARIANT型」で返されるので「GetStringValue?」等の関数にまとめました。
    ObjectからGetProp?して得られる「VARIANT型」を判定に使用しています。
  ////////////////////////////////////////////////////////////////////////////////
  //  DxDiag でSystem情報を取得
  ////////////////////////////////////////////////////////////////////////////////
  bool CDxDiagLib::GetSyatemInfo( void )
  {
    HRESULT           hr;
    IDxDiagContainer* pObject         = NULL;
    DWORD             nInstanceCount    = 0;
    DWORD             nItem             = 0;
    DWORD             nCurCount         = 0;

    // "DxDiag_SystemInfo" を取得
    if( FAILED( hr = m_pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo",
                                                       &pObject ) ) )
    {
      return false;
    }

    // 情報保存領域の確保
    ZeroMemory(&g_DxDiagSysInfo, sizeof(g_DxDiagSysInfo));

    if( FAILED( hr = GetStringValue( pObject, L"szSystemManufacturerEnglish",
                                     g_DxDiagSysInfo.cManufacturer ,
                                     sizeof(g_DxDiagSysInfo.cManufacturer) ) ) )
    {
      SAFE_RELEASE( pObject );
      return false;
    }

    if( FAILED( hr = GetStringValue( pObject, L"szSystemModelEnglish",
                                     g_DxDiagSysInfo.cModel ,
                                     sizeof(g_DxDiagSysInfo.cModel) ) ) )
    {
      SAFE_RELEASE( pObject );
      return false;
    }

    if( FAILED( hr = GetStringValue( pObject, L"szProcessorEnglish",
                                     g_DxDiagSysInfo.cProcessor ,
                                     sizeof(g_DxDiagSysInfo.cProcessor) ) ) )
    {
      SAFE_RELEASE( pObject );
      return false;
    }

    if( FAILED( hr = GetStringValue( pObject, L"szPhysicalMemoryEnglish",
                                     g_DxDiagSysInfo.cMemory ,
                                     sizeof(g_DxDiagSysInfo.cMemory) ) ) )
    {
      SAFE_RELEASE( pObject );
      return false;
    }

    SAFE_RELEASE( pObject );

    return true;
  }

取得結果の見本

-------------------- PC Info --------------------
[  O S  ] WindowsXP Professional Service Pack 2
[  CPU  ] Intel(R) Pentium(R) M processor 1400MHz
[ Maker ] NEC                             
[ Model ] PC-LM5007D                      
[ Memory] 766MB RAM
[DirectX] DirectX9.0c
[  VGA  ] MOBILITY RADEON 9000 AGP (0x4C66)
[ V-RAM ] 32.0 MB
[ Driver] 6.14.0010.6360
[  DDI  ] 9 (or higher)
[Direct3D] 有効
[AGP Acceleration] 有効
[ Sound ] Intel(r) Integrated Audio
[ Driver] 5.10.0000.3552
[Acceleration Level] フル
  • 「DDI」は使用しているグラフィックカードのドライババージョンがどのDirectXに対応しているかを示しています。
    この項目が動作環境のDirectXバージョンよりも低い場合は不具合が起こる可能性があります。
  • 「Direct3D」を実行する際にグラフィックカードの支援が有効か示します。
    無効の場合エミュレーション動作になるため非常に重くなります。
  • 「AGP Acceleration」AGP テクスチャー支援が有効か示します。
    無効の場合、動作が重くなる場合があります。
  • 「Acceleration Level」サウンドのハードウェア支援状態を示します。
    「無効」「基本」「標準」「フル」があり、サウンドの調子がおかしい場合は、DirectX診断ツールで無効などにすることで、動作がエミュレーションよりになって回避できる場合があります。

Microsoft(R) System Check Tool for PC Games