程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 如何在C++ Builder中檢測硬件

如何在C++ Builder中檢測硬件

編輯:關於C++

在我們編寫的程序中常常要和硬件打交道,那麼如何在程序中確定系統中是否有該 設備,它的運行狀態又是怎樣的呢?對於初學者來說,這個問題常常不好解決,其實只需 簡單地利用幾個API函數,硬件的問題並不神秘。下面就讓我們一起看看在C++ Build er中是如何檢測硬件的。

1. 檢測CPU的型號

先讓我們從最簡單的做起,看一看自己的CPU型號。首先,在C++ Builder中畫 出圖1所示的窗體,在下面的幾個例子中我們將一直使用這個窗體作示范,它包括一個用 來激活測試的Button和一個用來顯示結果的Memo。我們可以用GetSystemInfo這個API獲 得CPU的型號。將下列代碼添加到Button的Click事件裡就可以了:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//獲得CPU型號
SYSTEM_INFO systeminfo;
GetSystemInfo (&systeminfo);
Memo1->Lines->Add("您的CPU類型是:"+String( systeminfo.dwProcessorTy pe ));
}

運行它,點擊Test試試,CPU型號出來了吧!

2.檢測內存狀態

獲得內存狀態的方法和CPU型號差不多,只是他用到的是另外一個API:GlobalMe moryStatus。其中,成員dwTotalPhys用來獲得物理內存總量,而dwAvailPhys顧名思義 是有效物理內存的意思。我們只要把下面幾行代碼加到上面程序的後面就可以了(不用重做,下同):

//獲得內存狀態

MEMORYSTATUS memory;

memory.dwLength =sizeof(memory); //初始化

memory.dwLength =sizeof(memory); //初始化

GlobalMemoryStatus(&memory);

Memo1->Lines->Add("您的物理內存是(Mb):"+String(int(memory.dwTotalPh ys /1024/1024)));

Memo1->Lines->Add("其中可用內存是(Kb):"+String(int( memory. /1024)) );

怎麼樣,看出點門道了麼?兩段程序的格式幾乎一模一樣,其實,GetSystemInf o和GlobalMemoryStatus還可以獲得許多其他有關CPU和內存的信息,就按照上面的格式 去套就行了,更詳細的資料可以去看C++ Builder4的Help。

3. 檢測可用硬盤空間

好了,經過前面兩個簡單問題的熱身,我們來處理一個稍微復雜的問題:我們知 道安裝程序大都有一個檢測硬盤空間的過程,那麼這是怎麼實現的呢?他用到的是 API函 數GetDiskFreeSpace,這個函數輸入一個參數:目標盤的路徑;返回四個參數,依次是 每簇的扇區數、每扇區的字節數、空閒的簇數、總簇數。假如我們需要檢測C盤的總容量 和可用容量,那麼可以把以下代碼加到上面的程序中:

//獲得C盤可用空間

DWORD sector,byte,cluster,free;

long int freespace,totalspace;

GetDiskFreeSpace("C:",&sector,&byte,&free,&cluster); //獲得返回參 數

totalspace=int(cluster)*int(byte)*int(sector)/1024/1024; //計算總容量   freespace=int(free)*int(byte)*int(sector)/1024/1024; //計算可用空間

Memo1->Lines->Add("C盤總空間(Mb):"+String(totalspace));

Memo1->Lines->Add("C盤可用空間(Mb):"+String(freespace));

怎麼樣?現在可以自己做安裝程序了吧!

4. 檢測CD-ROM

我們在編寫程序時常常需要讀取CD-ROM,可是究竟哪一個盤符是光驅呢?有人是 桓雠譚槍馇兀坑腥聳? 將最後一個盤符當作光驅的,但是當遇到雙光驅或者MO的情況時常常會出錯。其實這個 問題用一個API來解決並不困難,這就是:GetDriveType(),這個函數返回一個0~6之間 的值,依次代表:0—未知盤、1—不存在、2—可移動磁盤、3—固定磁盤、4—網絡磁盤 、5—CD-ROM、6—內存虛擬盤。因此我們可以添加下面代碼來尋找CD-ROM:

// 獲得CD-ROM信息
UINT type;
char name;
for (name=‘C’;name<=‘Z’;name++) //循環檢測A~Z
{ type = GetDriveType((String(name)+String(‘:’)).c_str()); //獲得磁 盤類型
if (type==5)
Memo1->Lines->Add("您的光驅盤符為:"+String(name));
}

得到光驅盤符之後我們可以進一步利用API函數GetVolumeInformation檢測光驅中 是否有光盤,這個函數如果成功調用,會得到磁盤的卷標序列號等信息;如果調用失敗 則可知光驅中無光盤,程序如下://檢測光盤(假設光驅為G:)

char volname[255],filename[100];//buffer[512];
DWORD sno,maxl,fileflag ;
if (!(GetVolumeInformation("G:", volname,255,&sno,&maxl,&fileflag ,filename,100)))
//如果返回值為假
Memo1->Lines->Add ("G驅中沒有發現光盤");
else
//如果返回值為真
{Memo1->Lines->Add ("G驅中光盤卷標為:"+String(volname));
Memo1->Lines->Add ("G驅中光盤序號為:"+String(sno));
}

5. 檢測聲卡配置

在編制多媒體程序時,我們常常會用到聲音文件,而當這些程序在沒有配置聲卡 的機器上運行時,我們應該給出必要的警告。對於聲卡的檢測,可以分別通過waveOutG etNumDevs()和midiOutGetNumDevs()檢測波形設備和MIDI設備,再利用waveOutGetDevC aps()和midiOutGetDevCaps()獲得聲音設備的細節資料。將下面一段代碼加入上面的程 序即可,但要注意將#include 添至程序首部:

//檢測聲卡
int wavedevice,mididevice;
WAVEOUTCAPS wavecap;
MIDIOUTCAPS midicap;
wavedevice=(int)waveOutGetNumDevs(); //波形設備信息   mididevice=(int)midiOutGetNumDevs(); // MIDI設備信息   mididevice=(int)midiOutGetNumDevs(); // MIDI設備信息
if (wavedevice==0)
Memo1->Lines->Add ("沒有發現波形設備");
else
{waveOutGetDevCaps(0,&wavecap,sizeof(WAVEOUTCAPS));
Memo1->Lines->Add ("當前波形設備:"+String(wavecap.szPname));
}
if (mididevice==0)
Memo1->Lines->Add ("沒有發現MIDI設備");
else
{midiOutGetDevCaps(0,&midicap,sizeof(MIDIOUTCAPS));
Memo19->Lines->Add ("當前MIDI設備:"+String(midicap.szPname));
}

6. 檢測顯示器信息

編寫和圖形圖像有關的程序時常常需要檢測顯示器的分辨率和色深,最後我們來 看看這個問題的解決辦法。分辨率的求法很簡單,直接調用Screen對象的屬性就行了。 而要求色深則要利用API函數GetDeviceCaps獲得每像素的比特數和色彩的頁面數,然後 計算2的"每像素的比特數"次冪即得色彩的梯度數,再計算"色彩的梯度數"的"色彩 的頁面數"次冪即得色深。程序如下:

//檢測顯示器
int tcs;
long int bpp,cp,tc;
Memo1->Lines->Add ("當前分辨率為:"+String(Screen->Width)+"*"+S tring(Screen->Height));
bpp=GetDeviceCaps(Form1->Canvas->Handle ,BITSPIXEL);
bpp=GetDeviceCaps(Form1->Canvas->Handle ,BITSPIXEL);
tcs=pow(2,bpp); //計算色彩的梯度數
cp= GetDeviceCaps(Form1->Canvas->Handle,PLANES);
tc= pow(tcs,cp); //計算色深
Memo1->Lines->Add("當前色深為:"+String(tc));

好了,現在在讓我們點擊一下Test吧,其實本文所涉 及的API函數的功能不止這些,大家下去可以查一查Win32 API手冊,或者直接在C++ Builder 4中察看Help。相信自己開發一個硬件檢測軟件也不是難事哦!

以上程序均在Windows98中文版、C++ Builder 4中調試通過,如果大家在硬件 檢測方面有什麼問題,請與本文作者探討,[email protected]。(西安 楊洪辰)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved