首页  编辑  

注册表转化成.REG文件

Tags: /超级猛料/Registry.注册表和INI/   Date Created:

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