一些修改注册表的软件里面都有备份和恢复注册表的功能,他们在程序里是怎样实现的?

解决方案 »

  1.   

    操作注册表需要认识到注册表的六个根键。看看DELPHI的定义:const
       { Reserved Key Handles. }
       {$EXTERNALSYM HKEY_CLASSES_ROOT}
       HKEY_CLASSES_ROOT = DWORD($80000000);
       {$EXTERNALSYM HKEY_CURRENT_USER}
       HKEY_CURRENT_USER = DWORD($80000001);
       {$EXTERNALSYM HKEY_LOCAL_MACHINE}
       HKEY_LOCAL_MACHINE = DWORD($80000002);
       {$EXTERNALSYM HKEY_USERS}
       HKEY_USERS = DWORD($80000003);
       {$EXTERNALSYM HKEY_PERFORMANCE_DATA}
       HKEY_PERFORMANCE_DATA = DWORD($80000004);
       {$EXTERNALSYM HKEY_CURRENT_CONFIG}
       HKEY_CURRENT_CONFIG = DWORD($80000005);
       {$EXTERNALSYM HKEY_DYN_DATA}
       HKEY_DYN_DATA = DWORD($80000006);它们必须在TRegistry变量的RootKey属性中指定。
    要取得某一个路径的某个键值,必须找到某一个主键,例如有如下一个路径存放着WORD97存放的程序路径:
      \Software\Microsoft\Office\8.0\Word\InstallRoot\Path
    其中,PATH是键,在它前面的便是主键(键的路径),而这些键又是放在HKEY_LOCAL_MACHINE这个根键中的。当然,我们想要的是PATH对应的数据,而不是想知道有PATH这个键存在。PATH的类型是一个字符串,所以需要一个字符串变量存放它,例程中使用直接显示的方法表达它。因此,读出PATH键数据的过程就应该是,确定根键,进入主键(路径),读出键的数据值。为了体现对注册表的写操作,我们还特意创建一个主键\Software\3hsoft和里面一个字符串的键MyData。下面是一小段关于此过程的程序,虽然内容不多,但基本上已经将读写的操作表现出来了。
     unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Registry; // 记得要加入这个红色的。
    type
      TForm1 = class(TForm)
          Button1: TButton;
          procedure Button1Click(Sender: TObject);
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    Const
      FPath = '\Software\Microsoft\Office\8.0\Word\InstallRoot';
      FKey = 'Path';
      FMyPath = '\Software\3hSoft';
      FMyKey = 'MyData';
    Var
      Reg : TRegistry;
    begin
      Reg := TRegistry.Create;
      try
        Reg.RootKey := HKEY_LOCAL_MACHINE;
        If Reg.OpenKey(FPath, False) then
           ShowMessage(Reg.ReadString(FKey)); // 读出的 WinWord 的路径就显示出来了。
        Reg.CreateKey(FMyPath);      // 创建我们的主键
        Reg.OpenKey(FMyPath, True);  // 进入我们自己的主键中
        Reg.WriteString(FMyKey, 'This is a registry operation test program.');
            // 写进键值。
      finally
        Reg.Free; // 用 Try..Finally 结构确保 REG 变量能够释放。
      end;
    end;
    end.