导入导出注册表项的类
2006-07-20 11:37:42 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佽鍨庨崘锝嗗瘱闂備胶顢婂▍鏇㈠箲閸ヮ剙鐏抽柡鍐ㄧ墕缁€鍐┿亜韫囧海顦﹀ù婊堢畺閺屻劌鈹戦崱娆忓毈缂備降鍔庣划顖炲Φ閸曨垰绠抽悗锝庝簽娴犻箖姊洪棃娑欐悙閻庢矮鍗抽悰顕€宕堕澶嬫櫖濠殿噯绲剧€笛囧箲閸ヮ剙钃熼柣鏂挎憸閻熷綊鏌涢…鎴濇灈妞ゎ剙鐗嗛—鍐Χ鎼粹€茬凹缂備緡鍠楅幐鎼佹偩閻戣棄纭€闁绘劕绉靛Λ鍐春閳ь剚銇勯幒鎴濐伀鐎规挷绀侀埞鎴︽偐閹绘帩浼€缂佹儳褰炵划娆撳蓟濞戞矮娌柟瑙勫姇椤ユ繈姊洪柅鐐茶嫰婢т即鏌熼搹顐e磳闁挎繄鍋涢埞鎴犫偓锝庘偓顓涙櫊閺屽秵娼幏灞藉帯闂佹眹鍊曢幊鎰閹惧瓨濯撮柛鎾村絻閸撳崬顪冮妶鍡楃仸闁荤啿鏅涢悾鐑藉Ψ瑜夐崑鎾绘晲鎼粹剝鐏嶉梺缁樻尰濞叉﹢濡甸崟顖氱疀闂傚牊绋愮花鑲╃磽娴h棄鐓愭慨妯稿妿濡叉劙骞樼拠鑼槰闂佸啿鎼崐濠毸囬弶搴撴斀妞ゆ梻銆嬪銉︺亜椤撶偛妲婚柣锝囧厴楠炴帡骞嬮弮鈧悗濠氭⒑鐟欏嫭鍎楅柛妯衡偓鐔插徍濠电姷鏁告慨鐑藉极閸涘﹥鍙忔い鎾卞灩绾惧鏌熼崜褏甯涢柍閿嬪灦閵囧嫰骞掗崱妞惧缂傚倷绀侀ˇ閬嶅极婵犳氨宓侀柛鈩冪⊕閸婄兘鏌涘┑鍡楊伀妞ゆ梹鍔曢埞鎴︽倻閸モ晝校闂佸憡鎸婚悷锔界┍婵犲洦鍤冮柍鍝勫暟閿涙粓姊鸿ぐ鎺戜喊闁告瑥楠搁埢鎾斥堪閸喓鍘搁柣蹇曞仧绾爼宕戦幘璇茬疀濞达絽鎲¢崐顖炴⒑绾懎浜归悶娑栧劦閸┾偓妞ゆ帒鍟惃娲煛娴e湱澧柍瑙勫灴閹瑩寮堕幋鐘辨闂備礁婀辨灙闁硅姤绮庨崚鎺楀籍閸喎浠虹紓浣割儓椤曟娊鏁冮崒娑氬幈闂佸搫娲㈤崝宀勬倶閻樼粯鐓曢柟鑸妼娴滄儳鈹戦敍鍕杭闁稿﹥鐗犲畷婵嬫晝閳ь剟鈥﹂崸妤€鐒垫い鎺嶈兌缁犲墽鈧厜鍋撳┑鐘辩窔閸嬫鈹戦纭烽練婵炲拑绲垮Σ鎰板箳閹冲磭鍠撻幏鐘绘嚑閼稿灚姣愰梻鍌氬€烽懗鑸电仚濠电偛顕崗妯侯嚕椤愩倖瀚氱€瑰壊鍠栧▓銊︾節閻㈤潧校缁炬澘绉瑰鏌ュ箵閹烘繄鍞甸柣鐘烘鐏忋劌顔忛妷褉鍋撶憴鍕碍婵☆偅绻傞~蹇涙惞閸︻厾锛滃┑鈽嗗灠閹碱偊锝炲鍥╃=濞达綁顥撻崝宥夋煙缁嬪灝鏆遍柣锝囧厴楠炲鏁冮埀顒傜不婵犳碍鍋i柛銉戝啰楠囬悗瑙勬尭缁夋挳鈥旈崘顔嘉ч柛鈩兠棄宥囩磽娴e壊鍎愰柛銊ュ缁顓兼径瀣偓閿嬨亜閹哄秶顦︾€殿喖鐏濋埞鎴﹀煡閸℃浠梺鍛婎焼閸曨収娲告俊銈忕到閸燁垶宕愰崹顐e弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�

核心提示:本文示例源代码或素材下载 最近因为工作的需要,要对注册表项进行备份恢复,导入导出注册表项的类,于是我就去了解了一下注册表的相关内容,原本我打算用RegSaveKey和RegRestoreKey来进行备份恢复,我除了EnumerateValues函数没有修改外,其他的函数全都重新写了一遍,可是在使用过程中发现这两
本文示例源代码或素材下载
最近因为工作的需要,要对注册表项进行备份恢复,于是我就去了解了一下注册表的相关内容。原本我打算用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方式导入导出注册表项
更多精彩
赞助商链接