首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++ Builder 硬體偵測實戰:CPU、記憶體、硬碟、光碟機資訊獲取

     編輯:VC 教學

前言

應用程式常需檢測硬體環境(授權綁定、效能調適、安裝前檢查)。Windows 提供豐富 API,本文示範在 BCB 中呼叫 GetSystemInfo、GlobalMemoryStatus、GetDiskFreeSpace、GetDriveType、GetVolumeInformation 獲取核心硬體資訊,附完整 UI 範例代碼。

一、統一測試介面

建立表單 TForm1,放置:

  • Button1(Caption="檢測")
  • Memo1(顯示結果)

所有代碼寫在 Button1Click 事件中,逐項追加。

二、CPU 型號偵測


SYSTEM_INFO si;
GetSystemInfo(&si);
Memo1->Lines->Add("CPU 類型: " + IntToStr(si.dwProcessorType));
// dwProcessorType: PROCESSOR_INTEL_386(386), 486(486), PENTIUM(586), IA64(2200), AMD64(8664) 等

si.dwNumberOfProcessors 可取得邏輯處理器數量。

三、記憶體狀態


MEMORYSTATUS ms;
ms.dwLength = sizeof(ms);
GlobalMemoryStatus(&ms);

Memo1->Lines->Add("物理記憶體總量: " + FormatFloat("#,##0 MB", ms.dwTotalPhys / 1024.0 / 1024.0));
Memo1->Lines->Add("可用物理記憶體: " + FormatFloat("#,##0 MB", ms.dwAvailPhys / 1024.0 / 1024.0));
Memo1->Lines->Add("分頁檔總量: " + FormatFloat("#,##0 MB", ms.dwTotalPageFile / 1024.0 / 1024.0));
Memo1->Lines->Add("可用分頁檔: " + FormatFloat("#,##0 MB", ms.dwAvailPageFile / 1024.0 / 1024.0));
Memo1->Lines->Add("虛擬記憶體總量: " + FormatFloat("#,##0 MB", ms.dwTotalVirtual / 1024.0 / 1024.0));
Memo1->Lines->Add("可用虛擬記憶體: " + FormatFloat("#,##0 MB", ms.dwAvailVirtual / 1024.0 / 1024.0));

註:XP/2003 以上建議用 GlobalMemoryStatusEx(MEMORYSTATUSEX)支援 >4GB 記憶體。

四、硬碟空間(以 C 槽為例)


DWORD sectPerClust, bytesPerSect, freeClusters, totalClusters;
GetDiskFreeSpace("C:\\", §PerClust, &bytesPerSect, &freeClusters, &totalClusters);

__int64 totalBytes = (__int64)totalClusters * sectPerClust * bytesPerSect;
__int64 freeBytes  = (__int64)freeClusters  * sectPerClust * bytesPerSect;

Memo1->Lines->Add("C: 總容量: " + FormatFloat("#,##0 MB", totalBytes / 1024.0 / 1024.0));
Memo1->Lines->Add("C: 可用空間: " + FormatFloat("#,##0 MB", freeBytes / 1024.0 / 1024.0));

更簡潔的 GetDiskFreeSpaceEx 直接回傳 64 位元值,建議優先使用。

五、光碟機偵測與媒體狀態

5.1 掃描所有磁碟機型別


for (char drv = 'A'; drv <= 'Z'; drv++) {
    char root[4] = {drv, ':', '\\', 0};
    UINT type = GetDriveType(root);
    switch (type) {
        case DRIVE_REMOVABLE: Memo1->Lines->Add(drv + ": 可移動磁碟"); break;
        case DRIVE_FIXED:     Memo1->Lines->Add(drv + ": 固定磁碟"); break;
        case DRIVE_REMOTE:    Memo1->Lines->Add(drv + ": 網路磁碟"); break;
        case DRIVE_CDROM:     Memo1->Lines->Add(drv + ": 光碟機"); break;
        case DRIVE_RAMDISK:   Memo1->Lines->Add(drv + ": 記憶體虛擬碟"); break;
        default:              /* DRIVE_UNKNOWN, DRIVE_NO_ROOT_DIR */ break;
    }
}

5.2 檢測光碟機是否有媒體


char volName[256], fsName[256];
DWORD volSerial, maxCompLen, fsFlags;
if (GetVolumeInformation("G:\\", volName, 256, &volSerial, &maxCompLen, &fsFlags, fsName, 256)) {
    Memo1->Lines->Add("G: 卷標: " + AnsiString(volName));
    Memo1->Lines->Add("G: 序號: " + IntToStr(volSerial));
    Memo1->Lines->Add("G: 檔案系統: " + AnsiString(fsName));
} else {
    Memo1->Lines->Add("G: 無媒體或無法讀取");
}

六、完整 Button1Click 範例


void __fastcall TForm1::Button1Click(TObject *Sender) {
    Memo1->Clear();
    // CPU
    SYSTEM_INFO si; GetSystemInfo(&si);
    Memo1->Lines->Add("=== CPU ===");
    Memo1->Lines->Add("型別: " + IntToStr(si.dwProcessorType));
    Memo1->Lines->Add("邏輯處理器數: " + IntToStr(si.dwNumberOfProcessors));

    // 記憶體
    MEMORYSTATUS ms; ms.dwLength = sizeof(ms); GlobalMemoryStatus(&ms);
    Memo1->Lines->Add("\n=== 記憶體 ===");
    Memo1->Lines->Add("物理總量: " + FormatFloat("#,##0 MB", ms.dwTotalPhys/1024.0/1024.0));
    Memo1->Lines->Add("可用物理: " + FormatFloat("#,##0 MB", ms.dwAvailPhys/1024.0/1024.0));

    // 硬碟
    DWORD spc, bps, fc, tc;
    GetDiskFreeSpace("C:\\", &spc, &bps, &fc, &tc);
    __int64 total = (__int64)tc * spc * bps;
    __int64 free  = (__int64)fc * spc * bps;
    Memo1->Lines->Add("\n=== C: 硬碟 ===");
    Memo1->Lines->Add("總容量: " + FormatFloat("#,##0 MB", total/1024.0/1024.0));
    Memo1->Lines->Add("可用: " + FormatFloat("#,##0 MB", free/1024.0/1024.0));

    // 光碟機
    Memo1->Lines->Add("\n=== 磁碟機列表 ===");
    for (char d='A'; d<='Z'; d++) {
        char root[4]={d,':','\\',0};
        UINT t=GetDriveType(root);
        if (t==DRIVE_CDROM) {
            Memo1->Lines->Add(d + ": CD-ROM");
            char vol[256], fs[256]; DWORD vsn, mcl, ff;
            if (GetVolumeInformation(root, vol, 256, &vsn, &mcl, &ff, fs, 256))
                Memo1->Lines->Add("  卷標: " + AnsiString(vol) + "  序號: " + IntToStr(vsn));
            else
                Memo1->Lines->Add("  (無媒體)");
        }
    }
}

七、進階延伸

  • WMI (System.Management):查詢 Win32_Processor、Win32_PhysicalMemory、Win32_LogicalDisk 獲取更豐富資訊(序號、製造商、溫度、SMART)。
  • SetupAPI:枚舉裝置介面,獲取 USB、PCI、藍牙等裝置詳細屬性。
  • SMART 讀取:透過 DeviceIoControl + SMART_RCV_DRIVE_DATA 讀取硬碟健康狀態。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved