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

VC 註冊表操作完整封裝庫:讀寫刪多類型支援與實戰範例

     編輯:關於VC++

將 Windows 註冊表常用操作封裝為可復用函數庫,支援字串、DWORD、二進位三種資料類型的讀取、寫入、刪除鍵值與刪除子項,附完整調用範例。

函數介面設計

// 核心操作函數宣告
int ShowContent(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szValueName);           // 讀取字串值
int SetValue_S(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szValueName, LPBYTE pData); // 寫入字串
int SetValue_D(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szValueName, const DWORD* pData); // 寫入 DWORD
int SetValue_B(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szValueName, const BYTE* pData);  // 寫入二進位
int DeleteKey(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szKeyName);                  // 刪除子項
int DeleteValue(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szValueName);              // 刪除鍵值

// 回傳:0 成功,非 0 失敗 (已內建 MessageBox 錯誤提示)

核心實作邏輯 (以 SetValue_S 為例)

int SetValue_S(HKEY hRoot, LPCTSTR szSubKey, LPCTSTR szValueName, LPBYTE pData) {
    HKEY hKey;
    int nRet = 1;  // 預設失敗
    if (RegOpenKeyEx(hRoot, szSubKey, 0, KEY_WRITE, &hKey) == ERROR_SUCCESS) {
        // 字串長度含結束符
        DWORD dwLen = (lstrlen((LPCTSTR)pData) + 1) * sizeof(TCHAR);
        if (RegSetValueEx(hKey, szValueName, 0, REG_SZ, pData, dwLen) == ERROR_SUCCESS)
            nRet = 0;
        else
            AfxMessageBox(_T("無法設定註冊表值"));
        RegCloseKey(hKey);
    } else {
        AfxMessageBox(_T("無法開啟註冊表項"));
    }
    return nRet;
}

完整調用範例

void CRegDemoDlg::OnSetValue_S() {  // 寫入字串
    HKEY hRoot = HKEY_CURRENT_USER;
    LPCTSTR szSubKey = _T("Software\\Microsoft");
    LPCTSTR szValue = _T("範例1");
    LPBYTE pData = (LPBYTE)_T("成功");
    if (SetValue_S(hRoot, szSubKey, szValue, pData) != 0)
        AfxMessageBox(_T("操作失敗!"));
}

void CRegDemoDlg::OnSetValue_D() {  // 寫入 DWORD
    HKEY hRoot = HKEY_CURRENT_USER;
    LPCTSTR szSubKey = _T("Software\\Microsoft");
    LPCTSTR szValue = _T("範例2");
    DWORD dwData = 4294967295;  // 0xFFFFFFFF
    if (SetValue_D(hRoot, szSubKey, szValue, &dwData) != 0)
        AfxMessageBox(_T("操作失敗!"));
}

void CRegDemoDlg::OnSetValue_B() {  // 寫入二進位
    HKEY hRoot = HKEY_CURRENT_USER;
    LPCTSTR szSubKey = _T("Software\\Microsoft");
    LPCTSTR szValue = _T("範例3");
    BYTE byData[4] = { 0x12, 0x34, 0x56, 0x78 };
    if (SetValue_B(hRoot, szSubKey, szValue, byData) != 0)
        AfxMessageBox(_T("操作失敗!"));
}

void CRegDemoDlg::OnDeleteValue() {  // 刪除鍵值
    if (DeleteValue(HKEY_CURRENT_USER, _T("Software\\Microsoft"), _T("範例1")) != 0)
        AfxMessageBox(_T("刪除失敗!"));
}

void CRegDemoDlg::OnDeleteKey() {    // 刪除子項
    if (DeleteKey(HKEY_CURRENT_USER, 
        _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"), 
        _T("Doc Find Spec MRU")) != 0)
        AfxMessageBox(_T("刪除失敗!"));
}

void CRegDemoDlg::OnShowContent() {  // 讀取顯示
    TCHAR szBuf[256];
    if (ShowContent(HKEY_CURRENT_USER, _T("Software\\Microsoft"), _T("範例1"), szBuf) == 0)
        MessageBox(szBuf, _T("讀取成功"));
}

關鍵技術細節

  1. 權限分離:讀取用 KEY_READ,寫入/刪除用 KEY_WRITE
  2. 資料類型對應:
    • 字串:REG_SZ / REG_EXPAND_SZ,長度含 \\0
    • DWORD:REG_DWORD,固定 4 位元組
    • 二進位:REG_BINARY,任意長度
  3. 路徑分隔符:註冊表路徑使用單反斜線 \\,C++ 字串常數需雙重轉義 \\\\ 或使用 _T("Software\\\\Microsoft")
  4. 錯誤處理:每步 API 檢查回傳值,RegCloseKey 確保在所有路徑執行
  5. 64 位相容:KEY_WOW64_64KEY/KEY_WOW64_32KEY 控制視圖

進階封裝建議 (C++11+)

  • 使用 std::unique_ptr 配合自訂刪除器自動管理 HKEY 生命週期
  • 模板化 RegValue<T> 統一讀寫介面,編譯期類型推導
  • 異常而非錯誤碼回傳,配合 RAII 保證資源釋放
  • 支援 REG_QWORD、REG_MULTI_SZ 等擴展類型

此封裝庫涵蓋 90% 以上註冊表操作場景,可直接整合至專案作為基礎設施組件。

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