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

[推薦] 如何在C++Builder中檢測硬件

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-25 12:09:40 IP:61.218.xxx.xxx 未訂閱
如何在C++Builder中檢測硬件 (西安 楊洪辰)    資料來源: http://go5.163.com/yarrows/tips/cbc_10.htm     在我們編寫的程序中常常要和硬件打交道,那麼如何在程序中確定系統中是否有該設備, 它的運行狀態又是怎樣的呢﹖對於初學者來說,這個問題常常不好解決,其實只需簡單地利 用幾個API函數,硬件的問題並不神秘。下面就讓我們一起看看在C++ Builder中是如何 檢測硬件的。 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.dwProcessorType ));
  }
運行它,點擊Test試試,CPU型號出來了吧! 2.檢測內存狀態 獲得內存狀態的方法和CPU型號差不多,只是他用到的是另外一個API:GlobalMemoryStatus。 其中,成員dwTotalPhys用來獲得物理內存總量,而dwAvailPhys顧名思義是有效物理內存 的意思。我們只要把下面幾行代碼加到上面程序的後面就可以了(不用重做,下同): //獲得內存狀態
  MEMORYSTATUS memory;
  memory.dwLength =sizeof(memory); //初始化
  GlobalMemoryStatus(&memory);
  Memo1→Lines→Add(“您的物理內存是(Mb):”+String(int(memory.dwTotalPhys /1024/1024)));
  Memo1→Lines→Add(“其中可用內存是(Kb):”+String(int( memory. /1024)));
怎麼樣,看出點門道了麼﹖兩段程序的格式幾乎一模一樣,其實,GetSystemInfo和 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. 檢測聲卡配置 在編制多媒體程序時,我們常常會用到聲音文件,而當這些程序在沒有配置聲卡的機 器上運行時,我們應該給出必要的警告。對於聲卡的檢測,可以分別通過waveOutGetNumDevs() 和midiOutGetNumDevs()檢測波形設備和MIDI設備,再利用waveOutGetDevCaps()和 midiOutGetDevCaps()獲得聲音設備的細節資料。將下面一段代碼加入上面的程序即可, 但要注意將#include 添至程序首部: //檢測聲卡
  int wavedevice,mididevice;
  WAVEOUTCAPS wavecap;
  MIDIOUTCAPS midicap;
  wavedevice=(int)waveOutGetNumDevs(); //波形設備信息
  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));
   }[/cdoe]
  6. 檢測顯示器信息
  編寫和圖形圖像有關的程序時常常需要檢測顯示器的分辨率和色深,最後我們來看看
這個問題的解決辦法。分辨率的求法很簡單,直接調用Screen對象的屬性就行了。而要求
色深則要利用API函數GetDeviceCaps獲得每像素的比特數和色彩的頁面數,然後計算2的
“每像素的比特數”次冪即得色彩的梯度數,再計算“色彩的梯度數”的“色彩的頁面數”
次冪即得色深。由於該段程序用到了冪運算,所以要記得加上#include ,程序如下:
  //檢測顯示器[code]
  int tcs;
  long int bpp,cp,tc;
  Memo1→Lines→Add (“當前分辨率為:”+String(Screen→Width)+“*”+
String(Screen→Height));
  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中調試通過,如果大家在硬件檢 測方面有什麼問題歡迎和我探討,mail to AlexYoung@263.net。 時間就是金錢---[ 發問前請先找找舊文章]
系統時間:2017-10-22 10:34:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!