全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2747
推到 Plurk!
推到 Facebook!

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

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-09-30 02:32:42 IP:61.70.xxx.xxx 未訂閱
如何在C Builder中檢測硬體 在我們編寫的程式中常常要和硬體打交道,那?如何在程式中確定系統中是否有該 設備,它的運行狀態又是怎樣的呢?對於初學者來說,這個問題常常不好解決,其實只需 簡單地利用幾個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,可是究竟哪一個盤符是光碟機呢?有人是 桓讎譚j?嶀a坑腥聳? 將最後一個盤符當作光碟機的,但是當遇到雙光碟機或者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的“每圖元的比特數”次冪即得色彩的梯度數,再計算“色彩的梯度數”的“色彩 的頁面數”次冪即得色深。由於該段?蠐玫攪嗣菰慫悖拷扈{[塹眉由希jnclude , 程式如下: //檢測顯示器 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吧,硬體情況盡收眼底(圖2)!其實本文所涉 及的API函數的功能不止這些,大家下去可以查一查Win32 API手冊,或者直接在C++ Builder 4中察看Help。相信自己開發一個硬體檢測軟體也不是難事哦! 以上程式均在Windows98中文版、C++ Builder 4中調試通過,如果大家在硬體 檢測方面有什?問題,請與本文作者探討,AlexYoung@263.net。
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-11-26 1:42:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!