Windows 登錄表為多層樹狀結構,六大根鍵(HKEY_LOCAL_MACHINE 等)下包含鍵與值。本文示範讀寫 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion 下的 RegisteredOwner(用戶名)與 RegisteredOrganization(公司名)。
RegOpenKeyEx:開啟鍵(KEY_READ 或 KEY_WRITE)RegQueryValueEx:讀取值RegSetValueEx:寫入值RegCloseKey:關閉鍵控制代碼HKEY hKey;
LPCTSTR path = _T("Software\\Microsoft\\Windows\\CurrentVersion");
LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &hKey);
if(ret != ERROR_SUCCESS) { AfxMessageBox(_T("無法開啟鍵")); return; }
BYTE buffer[256]; DWORD type = REG_SZ, size = 256;
ret = RegQueryValueEx(hKey, _T("RegisteredOwner"), NULL, &type, buffer, &size);
if(ret == ERROR_SUCCESS) m_strOwner = (LPCTSTR)buffer;
ret = RegQueryValueEx(hKey, _T("RegisteredOrganization"), NULL, &type, buffer, &size);
if(ret == ERROR_SUCCESS) m_strCompany = (LPCTSTR)buffer;
RegCloseKey(hKey);
// 假設已從對話框取得新字串 m_strOwner, m_strCompany
HKEY hKey;
LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_WRITE, &hKey);
if(ret != ERROR_SUCCESS) { AfxMessageBox(_T("無法開啟鍵寫入")); return; }
auto toBytes = [](CString s) {
BYTE* p = new BYTE[s.GetLength()+1];
memcpy(p, (LPCTSTR)s, s.GetLength()*sizeof(TCHAR));
p[s.GetLength()] = 0; return p;
};
BYTE* pOwner = toBytes(m_strOwner);
RegSetValueEx(hKey, _T("RegisteredOwner"), 0, REG_SZ, pOwner, m_strOwner.GetLength()+1);
delete[] pOwner;
BYTE* pComp = toBytes(m_strCompany);
RegSetValueEx(hKey, _T("RegisteredOrganization"), 0, REG_SZ, pComp, m_strCompany.GetLength()+1);
delete[] pComp;
RegCloseKey(hKey);
AfxMessageBox(_T("修改成功,請重啟生效"));
HKEY_LOCAL_MACHINE 需管理員權限(Vista+ 需 UAC 提升)CRegistry 類別統一管理開啟/關閉與錯誤處理同樣原理可讀寫任意路徑鍵值:應用程式設定、檔案關聯、啟動項、服務配置等。