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();
}
}
HKLM\Software 會被重導向至 HKLM\Software\WOW6432Node;需用 KEY_WOW64_64KEY 旗標 (Win32 API) 或 C++Builder 10.4+ TRegistry 新增 Access 屬性指定。HKLM 需管理員權限,Manifest 設定 requireAdministrator。ReadString 回傳 ANSI/Unicode 視專案字元集而定;建議統一用 ReadString + WideString。「登錄檔雖方便,但非資料庫:避免高頻寫入、大量二進位資料、跨平台需求。現代應用優先考慮 JSON/XML/SQLite 本地檔案。」