如何导出注册表项成一个注册表文件并导入。我用TRegistry的SaveKey,RestoreKey在Win2000下试过,结果失败,请指点。

解决方案 »

  1.   

    如何把注册表转换成一个.reg文件?
    请参考下面的单元:
    用法:
      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);implementationfunction 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.
      

  2.   


    Delphi的TRegistry注册表类方法详解  ●GetDataInfo方法
    Function GetDataInfo(const ValueName:String;Var Value:TRegDataInfo):Boolean;
    TregDataType=(rdunknown,rdstring,rdexpandstring,rdexpandstring,rdinterger,rdbinary);
    TregDataInfo=record
       Regdata:TRegDataType;数据类型
      dataSize:integer;数据大小
    end
    valuename:和当前键关联的数据值名称
    value:返回数据的信息,如为rdstring和rdexpandstring类型,则数据大小包括字符串未尾的空结束字符。
      如果成功返回True,失败返回False,并且Value的值为zeros
    rdexpandstring:是一个包含环境变量的字符串;如“%PATH%”。●CreateKey方法
    Function CreateKey(const Key:string):Boolena;
      新建一个名为Key的键,Key可以为绝对的或相对的名字,绝对名用反斜杠“\”开头,相对名是新建一个当前键的子键。新建没有值。
      成功返回True,否则返回False,如果该键已存在将不产生效果。●DeleteKey方法
    Function DeleteKey(const Key:string):Boolean;
      删除一个键及相关联的数据,在win95中子键也将被删除,NT中子键必须一个个删除。●DeleteValue方法
    Function DeleteValue (const Name:string):Boolean;
      删除当前键中指定的一个数据值name。●GetDataSize方法
    Function GetDataSize(const ValueName:string):integer;
      返回当前键中一个指定数值ValueName数据的大小。●GetDataType方法
    Function GetDataType(const Valuename;string):TRegDataType;
      返回当前键中一个指定数值Valuename数据的类型。●GetKeyInfo方法
    Function GetKeyInfo(var value:TRegkeyinfo):Boolean;
      返回当前键的信息,在于value中。
    TRegkeyinfo=record
      maxsubkeylen:integer;子键名的最长值(字节)
      numvalues:integer;键值的数量
      maxvaluelen;最长的键值名的长度
      Filetime:TFileTime;最后一次更改的时间
    end;●Getkeynames方法
    Procedure Getkeynames(strings:Tsrtings);
      返回当前键所有子键的名子列表串。●Getvaluenames
    Procedure Getvaluenames(strings:Tstrings);
      返回当前键所有键值名的列表串。●Hassubkeys方法
    Function hassubKeys:Boolean;
      判断当前键是否有子键,有返回True,否则返回False。●keyExists方法
    Function KeyExists(const Key:string):Boolean;
      判断指定的键是否存在。●LoadKey方法
    Function LoadKey(const Key,fileNmae:string):Boolean;
     在根键下新建
     从一个文件中加载注册信息到子键中,文件注册信息中包含数据值名、子键和数据。
      LoadKey使创建一个键单一化,子键,键值和数据在一人操作中完成,所有这些称为一组,和单独地创建它们不同应用程序可以在一个文件中读取一组数据,这在用户运行中重新设置有特别的用处。
     Key为要创建子键的名子
     FileName:为文件的位置,所指定的文件必须为以前用SaveKey函数或RegSaveKey API函数所建立的,文件名不能包括扩展名。●OpenKey方法
    Function OpenKey(const Key:string;cancreate:Boolean):Boolean;
      使用该函数可以指定一个键作为当前键,如果键为nil,则当前键 将设置为根键。
      Cancreate决定是否在指定键不存在时创建该键,该函数创建的键的键值将不确定。
      如果成功地打开或创建,该函数返回True。●OpenKeyReadOnly方法
    function OpenKeyReadOnly(const Key: String): Boolean;
      以只读的方式打开Key值指定的键。●CloseKey方法
    procedure CloseKey;
      当不再使用一个键时应用该方法关闭该键。●MoveKey方法
    procedure MoveKey(const OldName, NewName: String; Delete: Boolean);
      该方法移动或复制一个键到一个新的位置,并把键的名子改为NewName。
      在Win95/98下该的子键和数据将被一起移动或复制到新的位置,在NT下子键必须用MoveKey明确的移动或自制。●读取数据的方法
    function ReadBinaryData(const Name: String; var Buffer; BufSize: Integer):Integer;
    function ReadBool(const Name: String): Boolean;
    function ReadCurrency(const Name: String): Currency;
    function ReadDate(const Name: String): TDateTime;
    function ReadDateTime(const Name: String): TDateTime;
    function ReadFloat(const Name: String): Double;
    function ReadInteger(const Name: String): Integer;
    function ReadString(const Name: String): String;
    function ReadTime(const Name: String): TDateTime;
      以上方法从当前主键读取相应数据类型的键值的数据,如果类型不匹配将产生一个异常。●RegistryConnect方法
    function RegistryConnect(const UNCName: String): Boolean;
     与另一台计算机的注册表建立连接,在建立连接前应将Rootkey属性设为HKEY_USERS或HKEY_LOCAL_MACHINE。
     UNCName是另一台计算机的名子。格式如:\\computername 
     假如UNCName为nil,将打开本地计算机。
      

  3.   

    wuxuan:
    用你的方法导出成.Reg文件可行,但是怎样导入.Reg文件恢复原有的注册信息?
      

  4.   

    wuxuan:
    既然导出做成了,给我个导入示例没问题吧。你可只回答了我一半问题啊