如何导出导入注册表项

时间:2022-09-13 20:43:31
如何导出注册表项成一个注册表文件并导入。我用TRegistry的SaveKey,RestoreKey在Win2000下试过,结果失败,请指点。

9 个解决方案

#1


这么简单的问题都没人回答吗,分数这么好赚也不要吗

#2


如何把注册表转换成一个.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);

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.

#3



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,将打开本地计算机。

#4


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

#5


不懂,学习。帮你up

#6


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

#7


导出人家给你了,导入自己就不能模仿着自己做啊?别人都帮您做了,程序到底是谁写的啊?

#8


呵呵,有意见了。

#9


搞定了,散分

#1


这么简单的问题都没人回答吗,分数这么好赚也不要吗

#2


如何把注册表转换成一个.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);

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.

#3



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,将打开本地计算机。

#4


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

#5


不懂,学习。帮你up

#6


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

#7


导出人家给你了,导入自己就不能模仿着自己做啊?别人都帮您做了,程序到底是谁写的啊?

#8


呵呵,有意见了。

#9


搞定了,散分