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

SysInfo 類庫在《系統飛狐》中的應用:從 DLL 封裝到系統資訊擷取實戰

     編輯:關於VC++

本文介紹如何將開源的 SysInfo 類庫(需先編譯為 DLL)整合至 MFC 專案《系統飛狐》中,實現 CPU、磁碟、記憶體等硬體資訊的擷取與顯示。作者分享了從 DOS 主控台測試到 MFC 視窗應用的完整遷移過程與關鍵轉換技巧。

SysInfo 介面

圖 1:SysInfo 原始介面

一、SysInfo 架構概覽

  • 採用 DLL 匯出類別 SysInfo,提供 getCpuIdentification()、getCpuSpeed()、getNumProcessors()、getDriveStats() 等方法。
  • 專案包含 SysInfo.dll(釋出版/偵錯版)與測試專案 SysInfoTester(主控台應用)。
  • 頭文件透過巨集控制匯入/匯出與連結庫選擇:
#if !defined(SYSINFO_LINKSTATIC)
 #if defined(SYSINFO_EXPORTS)
 #define DLL_CLASS __declspec(dllexport)
 #else
 #define DLL_CLASS __declspec(dllimport)
 #pragma comment(lib, _DEBUG ? "SysInfoD.lib" : "SysInfo.lib")
 #endif
#else
 #define DLL_CLASS
 #pragma comment(lib, _DEBUG ? "SysInfosD.lib" : "SysInfos.lib")
#endif

二、主控台測試範例

#include "sys/SysInfo.h"
#include <iostream>
#include <vector>
using namespace std;

void main() {
    SysInfo sysInfo;
    cout << "CPU資訊" << endl;
    cout << "型號: " << sysInfo.getCpuIdentification() << endl;
    cout << "速度: " << sysInfo.getCpuSpeed() << " MHz" << endl;
    cout << "核心數: " << sysInfo.getNumProcessors() << endl;
    
    // 磁碟資訊
    const vector<DriveStats>* pv = sysInfo.getDriveStats();
    for (auto it = pv->begin(); it != pv->end(); ++it) {
        cout << "磁碟: " << it->getName() 
             << " 總計: " << it->getTotalSpace()
             << " 可用: " << it->getFreeSpace() << endl;
    }
    system("pause");
}

三、MFC 專案整合關鍵:std::string ↔ CString 轉換

SysInfo 回傳 std::string,MFC 使用 CString,需手動轉換:

#include "sys/SysInfo.h"
#include <string>
#include <vector>

void CDiskinfoDlg::OnInitDialog() {
    SysInfo info;
    const vector<DriveStats>* pvDriveStats = info.getDriveStats();
    for (auto i = pvDriveStats->begin(); i != pvDriveStats->end(); ++i) {
        std::string str1 = i->getName();      // 磁碟名
        std::string str2 = i->getTotalSpace(); // 總容量
        std::string str3 = i->getFreeSpace();  // 可用空間
        
        // std::string → CString 技巧:複製到 char 陣列再指派
        char buf[256];
        str1.copy(buf, str1.length(), 0); buf[str1.length()] = '\0';
        CString csName = buf;
        
        str2.copy(buf, str2.length(), 0); buf[str2.length()] = '\0';
        CString csTotal = buf;
        
        str3.copy(buf, str3.length(), 0); buf[str3.length()] = '\0';
        CString csFree = buf;
        
        CString str;
        str.Format(_T("分區 %s (總計:%s 可用:%s)"), csName, csTotal, csFree);
        m_DiskTree.InsertItem(str, rootItem);
    }
}
系統飛狐中調用SysInfo效果

圖 2:系統飛狐中顯示磁碟資訊

四、經驗總結

  • 善用成熟開源庫(如 SysInfo)可大幅縮短開發週期。
  • 跨模組(DLL/EXE、STL/MFC)資料類型轉換是整合關鍵,需謹慎處理記憶體所有權與編碼。
  • 介面設計應預留擴充性,便於未來整合更多硬體偵測功能(SMBIOS、WMI、OpenHardwareMonitor 等)。

五、結語

本文展示了從取得第三方 DLL 到完成 MFC 整合的完整路徑,包括建置設定、介面調用、資料轉換與 UI 呈現。完整原始碼可供下載,歡迎參考改良。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved