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

VC++ 登錄表操作完整指南:五大核心 API 從建立到刪除實戰詳解

     編輯:VC 教學

登錄表結構速覽

  • 根鍵: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。

五大核心 API 簽名與參數詳解

1. RegCreateKeyEx — 建立/開啟鍵

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
);

2. RegOpenKeyEx — 開啟既存鍵

LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);

不存在回傳 ERROR_FILE_NOT_FOUND。

3. RegSetValueEx — 寫入值

LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE* lpData, DWORD cbData);
  • dwType 決定 lpData 解讀方式。
  • 字串需含結束 \0,cbData = (lstrlen+1)*sizeof(TCHAR)。

4. RegQueryValueEx — 讀取值

LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
  • 兩次呼叫模式:第一次 lpData=NULL 取得所需緩衝區大小 lpcbData,配置記憶體後第二次實讀。

5. RegDeleteKey / RegDeleteValue — 刪除

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。
  • 用戶 vs 機器:使用者設定寫 HKCU,系統級設定寫 HKLM (需管理員)。
  • 備份還原:重大變更前 RegSaveKey 導出 .reg,支援回滾。
  • 64/32 位重導向:32-bit 程式存取 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 系統設定中樞,操作謹記「讀寫分離、最小權限、錯誤必檢、備份先行」。

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