工作中需要備份還原註冊表項,嘗試 RegSaveKey/RegRestoreKey 發現使用繁瑣,最終完成了兩種導入導出方案的封裝類。
直接枚舉註冊表鍵值,逐項寫入符合格式的文字檔。此法較原始但可控性強。核心函數 ExportRegistry:
void ExportRegistry(
CString cstrKeyRootName, // 根鍵名,如 HKEY_CURRENT_USER
CString cstrKeyName, // 子鍵路徑
CString cstrFileName) // 輸出檔案路徑
{
// 映射根鍵字串到 HKEY
HKEY hKeyRootName;
if (cstrKeyRootName == "HKEY_CLASSES_ROOT") hKeyRootName = HKEY_CLASSES_ROOT;
else if (cstrKeyRootName == "HKEY_CURRENT_USER") hKeyRootName = HKEY_CURRENT_USER;
// ... 其他根鍵
FILE *fp = fopen(cstrFileName, "w+");
if (!fp) { MessageBox(...); return; }
CString cstrFullPathStr = cstrKeyName.IsEmpty() ? cstrKeyRootName : cstrKeyRootName + "\\" + cstrKeyName;
// 寫入標頭:根據 OS 版本決定格式
DWORD dwVersion = GetVersion();
if (dwVersion < 0x80000000) // Windows NT
fprintf(fp, "Windows Registry Editor Version 5.00\n");
else // Win9x
fprintf(fp, "REGEDIT4\n");
EnumerateValues(hKeyRootName, cstrKeyName, fp, cstrFullPathStr); // 遞歸枚舉值
EnumerateKey(hKeyRootName, cstrKeyName, fp, cstrFullPathStr); // 遞歸枚舉子鍵
fclose(fp);
}
使用範例:
CRegisterExport re;
re.ExportRegistry("HKEY_CURRENT_USER", "Software\\VCKBASE", "C:\\Test.reg");
利用系統內建 regedit.exe 參數化操作,極為簡便。注意路徑與鍵值需加雙引號避免空格導致錯誤。
void ShellExportRegister(LPCTSTR lpExportStr, LPCTSTR lpExportFile)
{
CString strItem(lpExportStr), strFileName(lpExportFile);
CString strParameters = "/e \"" + strFileName + "\" \"" + strItem + "\"";
ShellExecute(0, "open", "regedit.exe", strParameters, NULL, SW_SHOWNORMAL);
}
void ShellImportRegister(LPCTSTR lpImportFile)
{
CString strItem(lpImportFile);
CString strParameters = "/s \"" + strItem + "\"";
ShellExecute(NULL, "open", "regedit.exe", strParameters, NULL, SW_HIDE); // 靜默導入
}
使用範例:
CRegisterExport re;
re.ShellExportRegister("HKEY_CURRENT_USER\\Software\\VCKBASE", "C:\\Test.reg");
re.ShellImportRegister("C:\\Test.reg");
圖 1:介面效果圖
目前缺少直接解析 .reg 檔並寫入註冊表的功能,有興趣者可自行擴充。本文配套完整原始碼。