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

C++Builder 註冊表操作完全指南:TRegistry 類別實戰

     編輯:VC 教學

註冊表結構速覽

六大根鍵:HKEY_CLASSES_ROOT (HKCR)、HKEY_CURRENT_USER (HKCU)、HKEY_LOCAL_MACHINE (HKLM)、HKEY_USERS (HKU)、HKEY_CURRENT_CONFIG (HKCC)、HKEY_PERFORMANCE_DATA。樹狀結構:鍵 → 子鍵 → 值 (名稱/資料/類型)。

TRegistry 核心用法

1. 建立實例與根鍵


TRegistry* reg = new TRegistry;  // 預設 RootKey = HKCU
// 切換根鍵
reg->RootKey = HKEY_LOCAL_MACHINE;  // 需管理員權限寫入

2. 開啟/建立/關閉鍵


// 開啟現有鍵 (唯讀)
if (reg->OpenKeyReadOnly("\\Software\\MyApp")) { ... }

// 開啟或建立鍵 (可寫)
if (reg->OpenKey("\\Software\\MyApp", true)) {  // true = 不存在則建立
    // 讀寫值...
    reg->CloseKey();
}

路徑格式:\\Software\\MyApp (絕對、相對根鍵)、SubKey (相對當前鍵)。

3. 讀寫值


// 寫入
reg->WriteString("Version", "1.0.0");
reg->WriteInteger("MaxConnections", 100);
reg->WriteBool("AutoStart", true);
reg->WriteBinaryData("Key", buffer, size);

// 讀取 (不存在會拋出異常,建議先檢查)
if (reg->ValueExists("Version"))
    AnsiString ver = reg->ReadString("Version");
int maxConn = reg->ReadInteger("MaxConnections");  // 不存在返回 0
bool autoStart = reg->ReadBool("AutoStart");

4. 列舉子鍵與值名稱


TStringList* keys = new TStringList;
reg->GetKeyNames(keys);  // 當前鍵下所有子鍵名稱
for (int i = 0; i < keys->Count; ++i)
    ListBox1->Items->Add(keys->Strings[i]);
delete keys;

TStringList* vals = new TStringList;
reg->GetValueNames(vals);  // 當前鍵下所有值名稱
// ...
delete vals;

注意:GetKeyNames/ValueNames 參數為 TStrings*,必須用衍生類 TStringList 實例化(TStrings 為抽象類)。

5. LazyWrite 屬性

  • LazyWrite = true (預設):寫入操作暫存記憶體,CloseKey() 時一次寫入磁碟 → 效能佳。
  • LazyWrite = false:每次寫入立即同步磁碟 → 關鍵設定即時生效、跨進程可見。

6. 釋放資源


reg->CloseKey();
delete reg;  // 釋放 new 配置的記憶體

完整範例:讀取軟體安裝路徑並顯示子鍵


void __fastcall TForm1::BtnReadClick(TObject* Sender) {
    TRegistry* reg = new TRegistry;
    reg->RootKey = HKEY_LOCAL_MACHINE;
    if (reg->OpenKeyReadOnly("\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")) {
        TStringList* keys = new TStringList;
        reg->GetKeyNames(keys);
        for (int i = 0; i < keys->Count; ++i) {
            TRegistry* sub = new TRegistry;
            sub->RootKey = HKEY_LOCAL_MACHINE;
            if (sub->OpenKeyReadOnly("\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + keys->Strings[i])) {
                if (sub->ValueExists("DisplayName")) {
                    ComboBox1->Items->Add(sub->ReadString("DisplayName"));
                }
                sub->CloseKey();
                delete sub;
            }
        }
        reg->CloseKey();
        delete keys;
    }
    delete reg;
}

常見錯誤與避坑

現代替代:Windows Runtime / 應用程式資料

  • UWP/WinUI 3:Windows.Storage.ApplicationData (Local/Roaming/LocalCache) —— 隔離、同步、無註冊表汙染。
  • 傳統桌面應用:SHGetKnownFolderPath(FOLDERID_LocalAppData) + JSON/INI/SQLite —— 可移植、易備份、版本控制友好。

總結

TRegistry 是 C++Builder 操作註冊表的核心封裝。掌握 **實例建立 → 根鍵設定 → 開啟鍵 → 讀寫/列舉 → 關閉鍵 → 釋放實例** 流程,注意 LazyWrite、路徑格式、權限、資源釋放。新專案優先考慮應用程式資料目錄 + 結構化儲存格式,註冊表僅用於系統級整合(檔案關聯、啟動項、服務設定)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤後果修正
忘記 CloseKey() / delete鍵控制代碼洩漏、記憶體洩漏用 RAII 包裝或 try__finally 確保釋放
直接用 TStrings* 宣告變數傳給 GetKeyNames編譯錯誤(抽象類無法實例化)用 TStringList*
寫入 HKLM 無管理員權限存取被拒絕、靜默失敗清單檔要求 requireAdministrator 或寫 HKCU
路徑分隔符用單反斜線 \C++ 字串逸出錯誤用雙反斜線 \\ 或原始字串 R"(\Software\MyApp)"
假設值存在直接 ReadString拋出 ERegistryException先 ValueExists() 或 try-catch