プログラミング

VC++によるDLLとVisual Basic/C++ BuilderでGUIを作成

CPU種別を認識し,プロセッサシリアル番号
を表示するプログラム

北山 洋幸


 連続して,WindowsからI/O制御を紹介しています.今度はI/Oではありませんが,インテル系CPUのCPUID命令を使った,プロセッサの詳細を探るプログラムを作ってみます.
 Pentium IIIの登場,Cyrix, IDT,およびAMD各社のCPUに対応させると面白いでしょう.各社のホームページにCPUIDの情報が掲載されています.詳細は,そちらを参照してください.
 プログラムは,CPUIDを実行する部分を,Visual C++を使い,DLLの形で開発します.GUI部の開発にはC++ Builderと,Visual Basicで2種類作ります.重要な部分はDLLにしてあります.Visual C++やVisual Basic,およびDelphiなどで使い勝手良く,あるいは,ほかの情報を表示するのも良いでしょう.
ダウンロードはこちらから

環境
 
Windows 9x,Windows NT(Intel)が動作するパソコン.
コンパイラ
 
Visual C++ 6.0 Professonal Edition以上
 C++ Builder 4.0 Professonal Edition以上または,Visual Basic 6.0 Professonal Edition以上

 インテルアーキテクチャは,新しい世代や新しいモデルのプロセッサ(8086,8088,Intel286,Intel386, Intel486, Pentium,MMX Pentium,Pentium Pro,Pentium II,Pentium II Xeon,Celeron, Pentium III)の登場とともに進展してきました.当初は,プロセッサインプリメントの多少の違いを使って,CPUを判別していました.筆者もMS-DOS時代に,CPU判別プログラムを作成し,パソコン雑誌にコラムを執筆したことがあります.
 しかし,CPUアーキテクチャの驚異的な発展に伴い,各プロセッサを識別する,洗練された手段が必要になりました.現在では,プロセッサに「CPUID」という命令が追加され,プロセッサの識別が簡単になりました.

CPUID命令の検出

 Intel486ファミリ以降のインテルプロセッサでは,EFLAGSレジスタの,ビット21 のIDフラグにより,CPUID命令を実行可能か,簡単に調べることができます.今回紹介するプログラムも,この方法を使います.ソフトウェア上でこのフラグの値を変更することができれば,そのプロセッサはCPUID命令を実行できます.図1を参照してください.
 FLAGSレジスタや,EFLAGSレジスタへのアクセスは,POPF,POPFD,PUSHF,PUSHFDの各命令を使用します.直接,データをフラグレジスタへ書き込むことはできません.このプログラムに,PUSHFD命令でIDフラグの値を読み取り,POPFD命令で変更する方法が入っています.

CPUID命令の出力

 CPUID命令の出力を表1に示します.EAXレジスタに機能番号を設定して,CPUID命令を実行すると,機能番号に従ったCPUID命令が所定の機能を実行します.すべてのCPUが,全部の機能を実行できるわけではありません.
 EAXレジスタへ“0”を設定して,CPUID命令を実行すると,最大機能番号を得ることができます.EAXに最大値が返されますので,以降の呼び出しでは,戻り値以下の値を使用しなければなりません.EAXレジスタに最大値が戻されるのに加え,ベンダーID文字列を受け取ることができます.EBX,EDX,ECXの各レジスタに,ベンダーID文字列も戻されます.これらのレジスタには,以下のASCII文字列が格納されます.

  GenuineIntel

 どのように,格納されるかは,ソースプログラムを参照してください.インテルアーキテクチャの互換品は,このCPUID命令を提供することができます.CPUID命令を実行したときに,“GenuineIntel”文字列が戻されない場合,CPUID命令は,インテル製品と互換性がないかもわかりません.

プログラムの構造

 プログラムは,CPUIDを実行するDLL部と,GUIを担当する部分に分かれています.そして,GUI部をC++ Builderで作成したものと,Visual Basicで作成したものの2種類があります(図2).

図2.JPG (26804 バイト)

DLLの開発(Cpuid\Cpuiddll)

 プログラムは,CPUIDを実行する部分をDLLにします.DLLは,Visual C++を使って開発します.Visual C++を使って,DLLを開発する手順を示します.

● AppWizard

 Visual C++を起動したら,「ファイル」→「新規作成」を押して,「新規作成」ダイアログを表示させます(図3).
 「プロジェクト」タブを押し,「Win32 Dynamic-Link Library」を選択します.このとき,DLLの名前も入力します.プラットフォームはWin32を使用します(図4).

Dll02.jpg (60347 バイト)

 「Win32 Dynamic-Link Library 1/1」が現れます.「単純なDLLプロジェクト」を選んで,終了を押してください(図5).
 新規プロジェクト情報が表示されます.内容をチェックして,誤りがなければOKを押します(図6).
 ここまでのWizardの操作で作成された内容を,ワークスペースのFileViewで参照してみます(図7).
 FileViewの状態で,右マウスボタンをクリックすると,ポップアップメニューが現れます(図8).
 「ファイルをプロジェクトへ追加」を選び,DEFファイルや,ヘッダーファイルを追加します(図9).
 ここまでの,操作でDLLのスケルトンができあがりました.あとは,ソースプログラムを変更します.

以下略


copyright 1999 北山洋幸