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

註冊表鍵值導入導出類的兩種實現方案

     編輯:關於VC++

工作中需要備份還原註冊表項,嘗試 RegSaveKey/RegRestoreKey 發現使用繁瑣,最終完成了兩種導入導出方案的封裝類。

方案一:手動枚舉讀寫 .reg 檔案

直接枚舉註冊表鍵值,逐項寫入符合格式的文字檔。此法較原始但可控性強。核心函數 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");

方案二:調用 ShellExecute 執行 regedit.exe

利用系統內建 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 檔並寫入註冊表的功能,有興趣者可自行擴充。本文配套完整原始碼。

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