在 VC++ 中嘗試向註冊表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 下創建新項 RuanJianBox,但遇到以下問題:
RegCreateKey 返回值正確,但註冊表編輯器中不顯示新項。RegCreateKeyEx 返回錯誤碼 1(ERROR_INVALID_FUNCTION)。HKEY sub;
CString skey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\RuanJianBox";
if (::RegCreateKey(HKEY_LOCAL_MACHINE, skey, &sub)) {
MessageBox("創建成功");
}
DWORD dwDisposition = REG_CREATED_NEW_KEY;
int aaa = ERROR_SUCCESS == ::RegCreateKeyEx(
HKEY_LOCAL_MACHINE, skey, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
NULL, &sub, &dwDisposition
);
if (aaa != ERROR_SUCCESS) {
CString strError;
strError.Format("%d", aaa);
MessageBox(strError);
}
::RegCloseKey(sub);
寫入 HKEY_LOCAL_MACHINE 需要管理員權限。請確保程序以**管理員身份運行**,或在清單文件中聲明 requireAdministrator。
RegCreateKeyEx 的第 4 參數 lpClass 應傳遞 NULL 或類名字符串,而非 NULL 字面量;第 6 參數 samDesired 建議使用 KEY_WRITE | KEY_READ 而非 KEY_ALL_ACCESS,以減少權限需求。
雖然代碼末尾調用了 RegCloseKey,但若中間發生錯誤跳過關閉,數據可能停留在緩存中。**務必在所有退出路徑中關閉句柄**,建議使用 RAII 封裝。
在 64 位 Windows 上,32 位程序訪問 HKEY_LOCAL_MACHINE\SOFTWARE 會被重定向到 Wow6432Node。若需操作 64 位視圖,需在 samDesired 中加入 KEY_WOW64_64KEY 標誌。
HKEY hKey = NULL;
LSTATUS status = RegCreateKeyEx(
HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\RuanJianBox",
0, NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ | KEY_WOW64_64KEY, // 明確指定 64 位視圖
NULL, &hKey, NULL
);
if (status == ERROR_SUCCESS) {
// 創建鍵值示例
const wchar_t* valueName = L"DisplayName";
const wchar_t* valueData = L"My Software";
RegSetValueEx(hKey, valueName, 0, REG_SZ,
(const BYTE*)valueData, (wcslen(valueData) + 1) * sizeof(wchar_t));
RegCloseKey(hKey);
MessageBox(L"創建並寫入成功");
} else {
CString msg;
msg.Format(L"失敗,錯誤碼: %d", status);
MessageBox(msg);
}
HKEY 句柄。RegSetValueEx,指定數據類型(REG_SZ, REG_DWORD 等)、名稱、數據指針及長度。RegCloseKey 釋放句柄。GetLastError() 獲取詳細錯誤信息,而非僅依賴返回值。HKEY_CURRENT_USER 驗證代碼邏輯,排除權限問題。