HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS、HKEY_CURRENT_CONFIG、HKEY_PERFORMANCE_DATA (NT)、HKEY_DYN_DATA (9x)。REG_SZ (字串)、REG_DWORD (32-bit 整數)、REG_BINARY、REG_MULTI_SZ、REG_EXPAND_SZ。LONG RegCreateKeyEx(
HKEY hKey, // 根鍵
LPCTSTR lpSubKey, // 子鍵路徑,不可以 \ 開頭
DWORD Reserved, // 保留,必 0
LPTSTR lpClass, // 鍵類別字串,既存則忽略
DWORD dwOptions, // REG_OPTION_NON_VOLATILE(持久) / VOLATILE(記憶體)
REGSAM samDesired, // 權限:KEY_ALL_ACCESS, KEY_READ, KEY_WRITE...
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全描述子,NULL=預設
PHKEY phkResult, // 輸出:開啟鍵句柄
LPDWORD lpdwDisposition // 輸出:REG_CREATED_NEW_KEY / REG_OPENED_EXISTING_KEY
);
LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);
不存在回傳 ERROR_FILE_NOT_FOUND。
LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE* lpData, DWORD cbData);
dwType 決定 lpData 解讀方式。\0,cbData = (lstrlen+1)*sizeof(TCHAR)。LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
lpData=NULL 取得所需緩衝區大小 lpcbData,配置記憶體後第二次實讀。LONG RegDeleteKey(HKEY hKey, LPCTSTR lpSubKey); // 刪除子鍵 (Win9x 遞迴,NT 需空鍵)
LONG RegDeleteValue(HKEY hKey, LPCTSTR lpValueName); // 刪除值
NT 下刪除非空鍵需 SHDeleteKey (shlwapi.dll) 或遞迴自行實現。
HKEY hKey;
DWORD disp;
CString path = _T("Software\\MyCompany\\MyApp");
// 建立/開啟
if (RegCreateKeyEx(HKEY_CURRENT_USER, path, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ, NULL, &hKey, &disp) != ERROR_SUCCESS)
return FALSE;
// 寫入字串與 DWORD
CString ver = _T("2.5.1");
RegSetValueEx(hKey, _T("Version"), 0, REG_SZ, (BYTE*)(LPCTSTR)ver, (ver.GetLength()+1)*sizeof(TCHAR));
DWORD build = 20240101;
RegSetValueEx(hKey, _T("Build"), 0, REG_DWORD, (BYTE*)&build, sizeof(DWORD));
// 讀取驗證
TCHAR buf[256]; DWORD sz = sizeof(buf), type;
RegQueryValueEx(hKey, _T("Version"), NULL, &type, (LPBYTE)buf, &sz);
ASSERT(type == REG_SZ);
RegCloseKey(hKey);
KEY_READ/KEY_WRITE,避免 KEY_ALL_ACCESS。HKCU,系統級設定寫 HKLM (需管理員)。RegSaveKey 導出 .reg,支援回滾。HKLM\Software 實際導向 Wow6432Node,需 KEY_WOW64_64KEY 旗標強制存取 64-bit 視圖。| 錯誤碼 | 含義 | 對策 |
|---|---|---|
| ERROR_ACCESS_DENIED (5) | 權限不足 | 以管理員執行 / 改寫 HKCU |
| ERROR_FILE_NOT_FOUND (2) | 鍵/值不存在 | 先 RegCreateKeyEx 或檢查路徑拼寫 |
| ERROR_MORE_DATA (234) | 緩衝區太小 | 先查大小再配置 |
| ERROR_BADKEY (1010) | 句柄無效 | 檢查 RegOpenKeyEx 回傳值 |
登錄表是 Windows 系統設定中樞,操作謹記「讀寫分離、最小權限、錯誤必檢、備份先行」。