最近因為工作的需要,要對注冊表項進行備份恢復,於是我就去了解了一下注冊表的相關內容。原本我打算用RegSaveKey和RegRestoreKey來進行備份恢復。可是在使用過程中發現這兩個函數使用起來非常麻煩,於是就尋找別的解決方法。經過一段時間的努力,我最終完成了注冊表項導入導出的功能。這個類簡介如下:
一、讀取注冊表項的各個鍵值,然後寫到文件中
void ExportRegistry(
這種方法比較原始,也比較復雜,是直接讀取、枚舉注冊表的鍵值,然後一項一項的寫到文件中。這種方法是我在參考Thanigai Murugan K.(具體的出處記不起來了)寫的。他原來導出的函數中存在比較多的問題,一是不能導出所有的鍵值,二是導出的有些鍵值不符合規范,無法進行導入。我除了EnumerateValues函數沒有修改外,其他的函數全都重新寫了一遍。這個函數使用起來也非常方便,例如:
CString cstrKeyRootName, //注冊表根值,如HKEY_CURRENT_USER
CString cstrKeyName, //注冊表子鍵
CString cstrFileName) //導出的文件名(包括路徑)
{
FILE *fp;
HKEY hKeyRootName;
CString cstrFullPathStr(_T(""));
if(cstrKeyRootName == _T("HKEY_CLASSES_ROOT"))
hKeyRootName = HKEY_CLASSES_ROOT;
else if(cstrKeyRootName == _T("HKEY_CURRENT_USER"))
hKeyRootName = HKEY_CURRENT_USER;
else if(cstrKeyRootName == _T("HKEY_LOCAL_MACHINE"))
hKeyRootName = HKEY_LOCAL_MACHINE;
else if(cstrKeyRootName == _T("HKEY_USERS"))
hKeyRootName = HKEY_USERS;
else if(cstrKeyRootName == _T("HKEY_PERFORMANCE_DATA"))
hKeyRootName = HKEY_PERFORMANCE_DATA;
else if(cstrKeyRootName == _T("HKEY_CURRENT_CONFIG"))
hKeyRootName = HKEY_CURRENT_CONFIG;
else if(cstrKeyRootName == _T("HKEY_DYN_DATA"))
hKeyRootName = HKEY_DYN_DATA;
fp = fopen(cstrFileName, "w+");
if(fp == NULL)
{
MessageBox(NULL, _T("Error while creating the file"), _T("Registry export"), MB_OK);
return;
}
if(cstrKeyName.IsEmpty())
cstrFullPathStr = cstrKeyRootName;
else
cstrFullPathStr = cstrKeyRootName + _T("\\") + cstrKeyName;
//// First print the header ..... this may be different for some version of Windows... do manually change if required
//Here need to add version check
DWORD dwVersion = GetVersion();
// Get build numbers for Windows NT or Win32s
if (dwVersion < 0x80000000) // Windows NT
{
fprintf(fp, "%s\n", _T("Windows Registry Editor Version 5.00"));
}
else // Win32s
{
fprintf(fp, "%s\n", _T("REGEDIT4"));
}
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方式導入導出注冊表項
使用ShellExecute函數進行注冊表導入導出就非常方便,不過有一點要注意,就是 要在文件路徑和注冊表項的字符串中添加"。因為,如果不添加"的話,在導入導出 的文件名有空格的時候,ShellExecute函數就會報錯。添加"如下:
CString strTemp = "/e \"C:\\Test.reg\" \"HKEY_CURRENT_USER\\Software\\VCKBASE\"";
導出void ShellExportRegister(
使用例子:
LPCTSTR lpExportStr, //注冊表項,如HKEY_CURRENT_USER\SofteWare
LPCTSTR lpExportFile) //導出的文件名(包括路徑)
{
CString strItem(lpExportStr);
CString strFileName(lpExportFile);
CString strFilePath;
CString strParameters;
int nIndex = 0;
strParameters = "/e \"" + strFileName + "\" \"" + strItem + "\"";
ShellExecute(0,"open","regedit.exe",
strParameters, NULL , SW_SHOWNORMAL);
}CRegisterExport re;
導入
re.ShellExportRegister("HKEY_CURRENT_USER\\Software\\VCKBASE","C:\\Test.reg");void ShellImportRegister(
LPCTSTR lpImportFile) //導入的注冊表文件
{
CString strItem(lpImportFile);
CString strParameters;
strParameters = "/s \"" + strItem + "\"";
ShellExecute(NULL,"open","regedit.exe",
strParameters,NULL,SW_HIDE);
}
使用例子:
CRegisterExport re;
re.ShellImportRegister("C:\\Test.reg");
現在還缺少直接讀取導出的注冊表文件,然後一項一項的寫到注冊表中的功能,如果 那位有時間的話,可以把這個功能添上。
圖像1:界面效果圖
本文配套源碼