程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 導入導出注冊表項的類

導入導出注冊表項的類

編輯:關於VC++

最近因為工作的需要,要對注冊表項進行備份恢復,於是我就去了解了一下注冊表的相關內容。原本我打算用RegSaveKey和RegRestoreKey來進行備份恢復。可是在使用過程中發現這兩個函數使用起來非常麻煩,於是就尋找別的解決方法。經過一段時間的努力,我最終完成了注冊表項導入導出的功能。這個類簡介如下:

一、讀取注冊表項的各個鍵值,然後寫到文件中

void ExportRegistry(
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);
}
這種方法比較原始,也比較復雜,是直接讀取、枚舉注冊表的鍵值,然後一項一項的寫到文件中。這種方法是我在參考Thanigai Murugan K.(具體的出處記不起來了)寫的。他原來導出的函數中存在比較多的問題,一是不能導出所有的鍵值,二是導出的有些鍵值不符合規范,無法進行導入。我除了EnumerateValues函數沒有修改外,其他的函數全都重新寫了一遍。這個函數使用起來也非常方便,例如: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:界面效果圖

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved