應用程式常需檢測硬體環境(授權綁定、效能調適、安裝前檢查)。Windows 提供豐富 API,本文示範在 BCB 中呼叫 GetSystemInfo、GlobalMemoryStatus、GetDiskFreeSpace、GetDriveType、GetVolumeInformation 獲取核心硬體資訊,附完整 UI 範例代碼。
建立表單 TForm1,放置:
Button1(Caption="檢測")Memo1(顯示結果)所有代碼寫在 Button1Click 事件中,逐項追加。
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 記憶體。
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 位元值,建議優先使用。
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;
}
}
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: 無媒體或無法讀取");
}
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(" (無媒體)");
}
}
}
Win32_Processor、Win32_PhysicalMemory、Win32_LogicalDisk 獲取更豐富資訊(序號、製造商、溫度、SMART)。DeviceIoControl + SMART_RCV_DRIVE_DATA 讀取硬碟健康狀態。