2012年1月12日木曜日

IDirect3D9::GetAdapterIdentifier

ドライバ名とかグラフィックスボードの名前まで取得可能.そして,そこまでの情報を利用する必要があるのかは良く分からない.PCゲームはあまりやらないからなぁ.

#include <sdkddkver.h>

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

#include <tchar.h>
#include <sstream>
typedef std::basic_ostringstream<TCHAR> tostringstream;

#include <d3d9.h>

#include <memory>

template <typename T>
struct release_deleter {
    typedef T * pointer;

    void operator()(T * p) const
    {
        p->Release();
    }
};

typedef std::unique_ptr<IDirect3D9, release_deleter<IDirect3D9> > d3d_ptr;

int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    // IDirect3D9オブジェクトの生成
    d3d_ptr pD3D(Direct3DCreate9(D3D_SDK_VERSION));

    // エラーチェック
    if(pD3D == NULL){
        MessageBox(
            NULL,
            TEXT("IDirect3D9のオブジェクトを生成できませんでした."),
            TEXT("失敗"),
            MB_OK
        );
        return -1;
    }

    UINT n = pD3D->GetAdapterCount();
    for(UINT i = 0; i < n; ++i){
        D3DADAPTER_IDENTIFIER9 identifier;
        pD3D->GetAdapterIdentifier(
            i,
            0,  // D3DENUM_WHQL_LEVELを指定するとネットから情報取得?
            &identifier
        );

        // GetAdapterIdentifier()の結果を文字列に
        tostringstream msg;
        msg << "Adapter " << i << '\n';
        msg << "Driver           : " << identifier.Driver << '\n';
        msg << "Description      : " << identifier.Description << '\n';
        msg << "DeviceName       : " << identifier.DeviceName << '\n';
        msg << "DriverVersion\n";
        msg << "    Product      : " << HIWORD(identifier.DriverVersion.HighPart) << '\n';
        msg << "    Version      : " << LOWORD(identifier.DriverVersion.HighPart) << '\n';
        msg << "    SubVersion   : " << HIWORD(identifier.DriverVersion.LowPart) << '\n';
        msg << "    Build        : " << LOWORD(identifier.DriverVersion.LowPart) << '\n';
        msg << "VendorId         : " << identifier.VendorId << '\n';
        msg << "DeviceId         : " << identifier.DeviceId << '\n';
        msg << "SubSysId         : " << identifier.SubSysId << '\n';
        msg << "Revision         : " << identifier.Revision << '\n';
        // msg << "DeviceIdentifier : " << identifier.DeviceIdentifier << '\n';
        msg << "WHQLLevel        : " <<
            (identifier.WHQLLevel >> 16) << TEXT("年") << 
            ((identifier.WHQLLevel & 0xFFFF) >> 8) << TEXT("月") <<
            (identifier.WHQLLevel & 0xFF) << TEXT("日\n");

        MessageBox(
            NULL,
            msg.str().c_str(),
            TEXT("結果"),
            MB_OK
        );
    }
    
    return 0;
}

0 件のコメント:

コメントを投稿