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

來源:互聯網
上載者:User

在我們編寫的程式中常常要和硬體打交道,那麼如何在程式中確定系統中是否有該 裝置,它的運行狀態又是怎樣的呢?對於初學者來說,這個問題常常不好解決,其實只需 簡單地利用幾個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個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.