« いつから登場したのか?Mr.ホッピー! | トップページ | カレー鍋風うどん »

2009年2月18日 (水)

VRAM容量ってどうやったら分かる!?

パソコンの情報を取得したい場合、どうしたら良いか色々探してみた。

最も簡単なのがレジストリ漁り。

大まかな情報は、レジストリから手に入る。

CPUの速度も得られる。

レジストリエディターで全てセーブしてから検索する早いよ♪

以下の部分で基本的な情報は、フォローできる。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"ProductName"=OS名
"CurrentBuild"=ビルディング番号
"CSDVersion"=サービスパック
"RegisteredOwner"=ユーザー名
"ProductId"=プロダクト番号

[HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0]
"VendorIdentifier"=CPUメーカー
"Identifier"=CPU型番
"~MHz"=CPUのクロック数

[HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System]
"Identifier"=システム

レジストリーで得られないメモリー容量は、「GlobalMemoryStatus」で得られます。

ドライブの総容量と空き容量などは、「GetDiskFreeSpaceEx」で得られます。

ビデオ名はダイレクトXで得てみる。

D3D = Direct3DCreate8( D3D_SDK_VERSION );
D3D->GetAdapterIdentifier( 0, D3DENUM_NO_WHQL_LEVEL, &VideoIdentifier );

最近のビデオカードの性能でVRAM容量は結構クリティカルな情報。

しかし簡単に取得する方法が無い!

どおしよう…?

どうやったら得られるのやら?

そんなこんなでいろいろ調べて行き当たったのがWMI
(Windows Management Instrumentation)。

色々探して最新版をインストールしたらコンパイルできなかった…。

どうやらバージョンで対応できないらしい…。

『ウィキペディア(Wikipedia)』にVC++6対応のライブラリ情報が!
Visual C++ 6.0に対応した最後の「Platform SDK」です。

と言う事でチョット古いバージョンをこっからダウンロードしましたよ…。
Windows Server 2003 PSDK Full Download with Local Install

※インストールするには、チョット癖がある。
※しかもインストール画面が更に癖がある。

かなり珍しいインストール処理だと思うよ。

ともかくインストールしてコンパイルして動きましたよ♪

//******************************************************************************
//    ビデオ情報の取得
//******************************************************************************
//**************************************
//    inculde
//**************************************
#define _WIN32_WINNT    0x0400
#include    <windows.h>
#include    <wbemcli.h>
#include    <stdio.h>
//**************************************
//    table
//**************************************
LPSTR            VideoMemoryTypeList[]    =
{
    "Other",                            //  0 = その他
    "Unknown",                            //  1 = 不明
    "VRAM",                                //  2 = VRAM
    "DRAM",                                //  3 = DRAM
    "SRAM",                                //  4 = SRAM
    "WRAM",                                //  5 = WRAM
    "EDO RAM",                            //  6 = EDO RAM
    "Burst Synchronous DRAM",            //  7 = バーストシンクロナスDRAM
    "Pipelined Burst SRAM",                //  8 = パイプラインバーストSRAM
    "CDRAM",                            //  9 = CDRAM
    "3DRAM",                            // 10 = 3DRAM
    "SDRAM",                            // 11 = SDRAM
    "SGRAM",                            // 12 = SGRAM
};
//**************************************
//    work
//**************************************
IEnumWbemClassObject    *Enum;
IWbemClassObject    *Object;
IWbemLocator    *Locator;
IWbemServices    *Services;
ULONG            Returned;
//**************************************
//    output
//**************************************
void string_output( const char* item, const OLECHAR* name )
{
    char            string[256];
    VARIANT            variant;
    Object->Get( name, 0, &variant, NULL, NULL );
    WideCharToMultiByte( CP_ACP, 0, variant.bstrVal, -1, string, sizeof( string ), NULL, NULL );
    printf( "%s%s\r\n", item, string );
}
//**************************************
//    ビデオ情報の取得
//**************************************
void main( void )
{
    BSTR            server, wql, path;
    VARIANT            variant;

    server    = SysAllocString( L"\\\\.\\root\\cimv2" );
    wql        = SysAllocString( L"WQL" );
    path    = SysAllocString( L"select * from Win32_VideoController" );

    CoInitializeEx( NULL, COINIT_MULTITHREADED );
    CoCreateInstance( __uuidof( WbemLocator ), NULL, CLSCTX_INPROC_SERVER, __uuidof( IWbemLocator ), ( LPVOID* )&Locator );
    Locator->ConnectServer( server, NULL, NULL, 0L, 0L, NULL, NULL, &Services );
    CoSetProxyBlanket( Services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DEFAULT );
    Services->ExecQuery( wql, path, WBEM_FLAG_FORWARD_ONLY, NULL, &Enum );
    Enum->Next( WBEM_INFINITE, 1, &Object, &Returned );

    string_output( "AdapterCompatibility    : ", L"AdapterCompatibility" );
    string_output( "VideoProcessor          : ", L"VideoProcessor" );
    string_output( "AdapterDACType          : ", L"AdapterDACType" );
    string_output( "Caption                 : ", L"Caption" );
    string_output( "DeviceID                : ", L"DeviceID" );
    string_output( "DriverVersion           : ", L"DriverVersion" );
    string_output( "InfSection              : ", L"InfSection" );
    string_output( "InstalledDisplayDrivers : ", L"InstalledDisplayDrivers" );

    Object->Get( L"AdapterRAM", 0, &variant, NULL, NULL );
    printf( "AdapterRAM              : %d MB\r\n", variant.lVal / 1024 / 1024 );

    Object->Get( L"VideoMemoryType", 0, &variant, NULL, NULL );
    printf( "VideoMemoryType         : %s\r\n", VideoMemoryTypeList[variant.lVal] );

    Enum->Release( );
    Services->Release( );
    SysFreeString( wql );
    SysFreeString( path );
    SysFreeString( server );
    CoUninitialize( );
}
//******************************************************************************
//    end
//******************************************************************************

上記のプログラムでビデオ関連の情報が得られます。

まあ、何かの参考になれば幸いです♪

PS.

よくよく考えてみればウインドウズは、APIで制御する事を前提にしている。
って事は、それが正常か調べられないといけない訳だ。
その為の仕組みの一つなのだろう。

でも、デバッグ処理に近いのであまり一般に公開していない?
ともかく一般に使い易くは、作っていないみたいです…。

自分のデバッグ処理も今一なので反面教師的な参考にしよう。(笑)

|

« いつから登場したのか?Mr.ホッピー! | トップページ | カレー鍋風うどん »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: VRAM容量ってどうやったら分かる!?:

« いつから登場したのか?Mr.ホッピー! | トップページ | カレー鍋風うどん »