將 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 錯誤提示)
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("讀取成功"));
}
KEY_READ,寫入/刪除用 KEY_WRITEREG_SZ / REG_EXPAND_SZ,長度含 \\0REG_DWORD,固定 4 位元組REG_BINARY,任意長度\\,C++ 字串常數需雙重轉義 \\\\ 或使用 _T("Software\\\\Microsoft")RegCloseKey 確保在所有路徑執行KEY_WOW64_64KEY/KEY_WOW64_32KEY 控制視圖std::unique_ptr 配合自訂刪除器自動管理 HKEY 生命週期RegValue<T> 統一讀寫介面,編譯期類型推導REG_QWORD、REG_MULTI_SZ 等擴展類型此封裝庫涵蓋 90% 以上註冊表操作場景,可直接整合至專案作為基礎設施組件。