パソコンの情報を取得したい場合、どうしたら良いか色々探してみた。
最も簡単なのがレジストリ漁り。
大まかな情報は、レジストリから手に入る。
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で制御する事を前提にしている。
って事は、それが正常か調べられないといけない訳だ。
その為の仕組みの一つなのだろう。
でも、デバッグ処理に近いのであまり一般に公開していない?
ともかく一般に使い易くは、作っていないみたいです…。
自分のデバッグ処理も今一なので反面教師的な参考にしよう。(笑)
最近のコメント