CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

如何动态的备份和还原注册表

楼主neo40(企鹅)2003-02-11 14:31:10 在 Delphi / VCL组件开发及应用 提问

如何动态的备份和还原注册表(要原代码),如果可行立即结贴。 问题点数:50、回复次数:2Top

1 楼cg1120(代码最优化-§惟坚韧者始能遂其志§)回复于 2003-02-11 14:43:52 得分 50

备份:  
   
  用法:  
      ExportRegistryToFile(HKEY_CURRENT_USER,'SoftWare\Borland','C:\aaaa.reg');  
  ///FileName:RegExport.pas  
  unit   RegExport;  
   
  interface  
  uses  
      windows,   registry,   Classes,   sysutils;  
   
  procedure   ExportRegistryToFile(const   Root:   HKEY;   const   Key:   string;   const   FileName:   TFileName);  
   
  implementation  
   
  function   DBLBackSlash(T:   string):   string;  
  ///本函数用来把一个'\'变成两个'\\',符合REG文件格式  
  var  
      K                                   :   Longint;  
  begin  
      Result   :=   T;  
      for   K   :=   Length(T)   downto   1   do  
          if   Result[k]   =   '\'   then   insert('\',   Result,   K);  
  end;  
   
  {$I-}  
   
  procedure   ExportRegistryToFile(const   Root:   HKEY;   const   Key:   string;   const   FileName:   TFileName);  
  var  
      Reg                               :   TRegistry;  
      F                                   :   TextFile;  
      p                                   :   PChar;  
      FKey                             :   string;  
   
      procedure   ProcessBranch(R:   string);   ///递归处理子键  
      var  
          Values,   Keys         :   TStringList;  
          i,   j,   k                   :   longint;  
          s,   t                         :   string;  
      begin  
          WriteLn(F);  
          case   Root   of  
              HKEY_CLASSES_ROOT:   s   :=   'HKEY_CLASSES_ROOT';  
              HKEY_CURRENT_USER:   s   :=   'HKEY_CURRENT_USER';  
              HKEY_LOCAL_MACHINE:   s   :=   'HKEY_LOCAL_MACHINE';  
              HKEY_USERS:   s   :=   'HKEY_USERS';  
              HKEY_PERFORMANCE_DATA:   s   :=   'HKEY_PERFORMANCE_DATA';  
              HKEY_CURRENT_CONFIG:   s   :=   'HKEY_CURRENT_CONFIG';  
              HKEY_DYN_DATA:   s   :=   'HKEY_DYN_DATA';  
          end;  
          WriteLn(F,   '['   +   s   +   '\'   +   R   +   ']');   ///like   [HKEY_CURRENT_USER\....\....\]  
          Reg.CloseKey;  
          Reg.OpenKey(R,   False);  
          Values   :=   TStringList.Create;  
          Keys   :=   TStringList.Create;  
          Reg.GetValueNames(Values);  
          Reg.GetKeyNames(Keys);  
          for   i   :=   0   to   Values.Count   -   1   do  
          begin  
              s   :=   Values.Strings[i];  
              t   :=   s;  
              if   s   =   ''   then   s   :=   '@'   else   s   :=   '"'   +   s   +   '"';  
              Write(F,   DBLBackSlash(s)   +   '=');  
              case   Reg.GetDataType(t)   of  
                  rdString,   rdExpandString:   Writeln(F,   '"'   +   DBLBackSlash(Reg.ReadString(t))   +   '"');  
                  rdInteger:   Writeln(F,   'dword:'   +   IntToHex(Reg.ReadInteger(t),   8));  
                  rdBinary:   begin  
                          Write(F,   'hex:');  
                          j   :=   Reg.GetDataSize(t);  
                          GetMem(p,   j);  
                          Reg.ReadBinaryData(t,   p^,   j);  
                          for   k   :=   0   to   j   -   1   do  
                          begin  
                              Write(F,   IntToHex(byte(p[k]),   2));  
                              if   k   <>   j   -   1   then  
                              begin  
                                  Write(F,   ',');  
                                  if   (K   >   0)   and   ((K   mod   25)   =   0)   then  
                                      WriteLn(F,   '\');  
                              end;   ///End   if   K<>j-1  
                          end;   ///For  
                          FreeMem(p,   j);  
                          WriteLn(F);  
                      end;  
              else   ///case   else  
                  WriteLn(F,   '""');   ///数据非法!  
              end;   ///   End   Case  
          end;   ///end   For  
          Reg.CloseKey;  
          Values.Free;  
          for   i   :=   0   to   Keys.Count   -   1   do  
              if   R   <>   ''   then  
                  ProcessBranch(R   +   '\'   +   Keys.Strings[i])  
              else  
                  ProcessBranch(Keys[i]);  
          Keys.Free;  
      end;  
   
  begin  
      FKey   :=   Key;  
      if   FKey   <>   ''   then  
          if   Key[Length(FKey)]   =   '\'   then  
              SetLength(FKey,   Length(FKey)   -   1);  
      AssignFile(F,   FileName);  
      ReWrite(F);  
      if   IOResult   <>   0   then   exit;  
      WriteLn(F,   'REGEDIT4');  
      Reg   :=   TRegistry.Create;  
      try  
          Reg.RootKey   :=   Root;  
          ProcessBranch(FKey);  
      finally  
          Reg.Free;  
          Close(F);  
      end;  
  end;  
  {$I+}  
   
  end.  
  Top

2 楼cg1120(代码最优化-§惟坚韧者始能遂其志§)回复于 2003-02-11 14:47:43 得分 0

还原:  
   
  WinExec("RegEdit.exe   /s   Backup.reg",   SW_HIDE);    
  或:  
  procedure   TFormMain.ButtonImportClick(Sender:   TObject);  
  var               //从文件导回到注册表  
    RootKey,phKey:   hKey;  
    KeyName,sKeyFileName:   String;  
    FileName:   array   [0..255]   of   char;  
  begin  
    RootKey   :=   HKEY_CURRENT_USER;  
    KeyName   :=   'software';//xxxxxxx  
    RegOpenKeyEx(RootKey,   PChar(KeyName),   0,   KEY_ALL_ACCESS,   phKey);  
    sKeyFileName   :=   'C:\aaaa.reg';  
    StrPCopy(FileName,sKeyFileName);  
    if   RegRestoreKey(phKey,   FileName,0)=   0   then    
        ShowMessage('注册表指定分支已恢复。')  
    else  
          ShowMessage('注册表指定分支没有恢复,操作失败。');  
      RegCloseKey(phKey);  
  end;  
  Top

相关问题

  • 大侠帮忙:我的w2k注册表备份后无法还原?
  • 如何还原注册表
  • win2k Server注册表的还原问题~~~~~~~~~~~~
  • 备份还原
  • 怎么备份和恢复注册表的数据?
  • 在VB中如何备份指定位置的注册表???
  • 请教怎样在程序中备份和恢复注册表
  • 怎样编程实现对注册表的备份?
  • 怎样编程实现对注册表的备份?
  • 如何编程实现备份注册表,用VC?

关键词

  • root
  • 注册表
  • processbranch
  • fkey
  • 备份
  • 还原
  • exportregistrytofile
  • skeyfilename
  • phkey
  • rootkey

得分解答快速导航

  • 帖主:neo40
  • cg1120

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo