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

VC++ 存取與修改系統登錄表實戰:查詢/設定用戶名與公司名稱

     編輯:VC 教學

登錄表基礎知識

Windows 登錄表為多層樹狀結構,六大根鍵(HKEY_LOCAL_MACHINE 等)下包含鍵與值。本文示範讀寫 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion 下的 RegisteredOwner(用戶名)與 RegisteredOrganization(公司名)。

核心 API

  • 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 類別統一管理開啟/關閉與錯誤處理

擴展應用

同樣原理可讀寫任意路徑鍵值:應用程式設定、檔案關聯、啟動項、服務配置等。

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