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

C++Builder 登錄檔操作:遞迴列舉子鍵與值的完整範例

     編輯:關於C++

Windows 登錄檔是階層式鍵值儲存,C++Builder 提供 TRegistry 類別封裝 Win32 Registry API。本文示範如何開啟指定根鍵、遞迴列舉所有子鍵名稱與值名稱/資料,並給出完整表單代碼與記憶體管理細節。

關鍵方法對照

方法用途
RootKey = HKEY_CURRENT_USER設定根鍵 (亦可 HKEY_LOCAL_MACHINE 等)
OpenKey(path, true)開啟/建立子鍵,第二參數 true 表示不存在時建立
GetKeyNames(StringList)取得所有子鍵名稱
GetValueNames(StringList)取得所有值名稱
ReadString(name)讀取字串值 (亦有 ReadInteger, ReadBinaryData 等)
CloseKey()關閉目前鍵釋放控制代碼

完整表單實作

#include 
#include 
#pragma hdrstop
#include "Unit1.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {}

void __fastcall TForm1::Button1Click(TObject *Sender) {
    TRegistry* reg = new TRegistry();
    TStringList* keys = new TStringList();
    TStringList* vals = new TStringList();
    try {
        reg->RootKey = HKEY_CURRENT_USER;
        if (reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\PINTLGNT", true)) {
            // 列舉子鍵
            reg->GetKeyNames(keys);
            for (int i=0; iCount; ++i)
                Memo1->Lines->Add("[Key] " + keys->Strings[i]);

            // 列舉值
            reg->GetValueNames(vals);
            for (int i=0; iCount; ++i)
                Memo1->Lines->Add("[Val] " + vals->Strings[i] + " = " + reg->ReadString(vals->Strings[i]));

            reg->CloseKey();
        }
    } __finally {
        delete reg;
        delete keys;
        delete vals;
    }
}

進階:遞迴列舉整棵子樹

void EnumRegTree(TRegistry* reg, const String& path, int depth) {
    if (!reg->OpenKey(path, false)) return;
    TStringList* keys = new TStringList();
    TStringList* vals = new TStringList();
    try {
        reg->GetKeyNames(keys);
        reg->GetValueNames(vals);
        String indent = String(' ', depth*2);
        for (int i=0; iCount; ++i)
            OutputDebugString((indent + "Val: " + vals->Strings[i] + "=" + reg->ReadString(vals->Strings[i])).c_str());
        for (int i=0; iCount; ++i)
            EnumRegTree(reg, path + "\\" + keys->Strings[i], depth+1);
    } __finally {
        delete keys; delete vals;
        reg->CloseKey();
    }
}

權限與重導向注意事項

  • 64 位元系統:32 位元應用存取 HKLM\Software 會被重導向至 HKLM\Software\WOW6432Node;需用 KEY_WOW64_64KEY 旗標 (Win32 API) 或 C++Builder 10.4+ TRegistry 新增 Access 屬性指定。
  • UAC:寫入 HKLM 需管理員權限,Manifest 設定 requireAdministrator。
  • 字串編碼:ReadString 回傳 ANSI/Unicode 視專案字元集而定;建議統一用 ReadString + WideString。
「登錄檔雖方便,但非資料庫:避免高頻寫入、大量二進位資料、跨平台需求。現代應用優先考慮 JSON/XML/SQLite 本地檔案。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved