首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ RegOpenKeyEx 返回 5 (ERROR_ACCESS_DENIED) 參數順序錯誤一行修正

     編輯:程式設計綜合問答

錯誤代碼

lRegRet = RegOpenKeyEx(HKEY_CURRENT_USER, USER_ENVREG, KEY_ALL_ACCESS, 0, &hKeyUser);
//                      ^ hKey          ^ lpSubKey     ^ ulOptions   ^ samDesired ^ phkResult
// 錯誤:第 3、4 參數顛倒!

正確原型

LSTATUS RegOpenKeyEx(
    HKEY hKey,
    LPCTSTR lpSubKey,
    DWORD ulOptions,      // 必須為 0 (保留)
    REGSAM samDesired,    // 權限掩碼 (KEY_READ, KEY_WRITE, KEY_ALL_ACCESS...)
    PHKEY phkResult
);

一行修正

lRegRet = RegOpenKeyEx(HKEY_CURRENT_USER, USER_ENVREG, 0, KEY_ALL_ACCESS, &hKeyUser);

為何管理員執行仍失敗?

  • ulOptions 傳入 KEY_ALL_ACCESS (非 0) → 系統視為無效旗標 → 返回 ERROR_INVALID_PARAMETER (87) 或進入未定義行為,最終顯示存取被拒。
  • UAC 提升僅影響進程權杖,**不修正 API 參數錯誤**。

完善錯誤處理範本


LSTATUS OpenUserEnvKey(PHKEY phk) {
    LSTATUS status = RegOpenKeyEx(HKEY_CURRENT_USER,
                                  L"Environment", // USER_ENVREG 通常為 "Environment"
                                  0, KEY_ALL_ACCESS, phk);
    if (status != ERROR_SUCCESS) {
        wchar_t msg[256];
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                      NULL, status, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                      msg, 256, NULL);
        MessageBox(NULL, msg, L"開啟註冊表失敗", MB_ICONERROR);
    }
    return status;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved