錯誤代碼
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;
}