Конференция "WinAPI" » как сохранить ветку реестра??? [D7, Win2k, WinXP]
 
  • AHTOLLlKA (02.05.09 13:37) [0]
    мне нужно сохранить некую ветку реестра
    например
    HKEY_LOCAL_MACHINE\SOFTWARE\Buka
    если использовать SaveKey то нужно получать привелегии дополнительные что уже не айс..
    и сохраненный файл будет бинарным... это дабл не айс..

    как сделать точно так же как при обычном экспорте из regedit.exe

    не используя конечно извращения аля WinExec('cmd /k reg export............
  • AHTOLLlKA (02.05.09 15:52) [1]
    собственно вот рабочий код если кому надо....


     procedure ExportRegistryBranch(Rootsection: Integer; regroot: string;
      FileName: string);
    implementation

    function FindDBL (s: string): integer;
    var
     i, count: integer;
    begin
     count := 0;
     for i:=1 to length(s) do
       if s[i]='\"' then
       begin
         count := count+1;
        end;
     FindDBL := count;
    end;

    function dblBackSlash(t: string): string;
    var
      k: longint;
    begin
      Result := t; {Strings are not allowed to have}
      for k := Length(t) downto 1 do {single backslashes}
        if Result[k] = '\' then Insert('\', Result, k);
    end;

    procedure ExportRegistryBranch(rootsection: Integer; Regroot: string;
      FileName: string);
    var
      reg: TRegistry;
      f: Textfile;
      p: PChar;
      correct:string;

      procedure ProcessBranch(root: string); {recursive sub-procedure}
      var
        values, keys: TStringList;
        i, j, k: longint;
        s, t: string; {longstrings are on the heap, not on the stack!}
      begin
        Writeln(f); {write blank line}
        case rootsection 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  + root + ']'); {write section name in brackets}

        reg.OpenKey(root, False);
        try
          values := TStringList.Create;
          try
            keys := TStringList.Create;
            try
              reg.GetValuenames(values); {get all value names}
              reg.GetKeynames(keys); {get all sub-branches}

              for i := 0 to values.Count - 1 do {write all the values first}
              begin
                s := values[i];
                t := s; {s=value name}

                if s = ''
                then s := '@' {empty means "default value", write as @}
                else s := '\"' + s + '\"'; {else put in quotes}

                Write(f, dblbackslash(s) + '='); {write the name of the key to the file}

                case reg.Getdatatype(t) of {What type of data is it?}

                  rdString, rdExpandString: {String-type}
          //          Writeln(f, '\"' + dblbackslash(reg.ReadString(t) + '\"'));
           if  FindDBL(dblbackslash(reg.ReadString(t)))>0 then
           begin
            correct  := StringReplace(dblbackslash(reg.ReadString(t)), '\"', '\\"',[rfReplaceAll, rfIgnoreCase]);
            Writeln(f, '\"' + correct + '\"');
           end
           else Writeln(f, '\"' + dblbackslash(reg.ReadString(t) + '\"'));

                  rdInteger: {32-bit unsigned long integer}
                    Writeln(f, 'dword:' + IntToHex(reg.readinteger(t), 8));

                 {write an array of hex bytes if data is "binary." Perform a line feed
                 after approx. 25 numbers so the line length stays within limits}


                  rdBinary:
                    begin
                      Write(f, 'hex:');
                      j := reg.GetDataSize(t); {determine size}
                      GetMem(p, j); {Allocate memory}
                      reg.ReadBinaryData(t, p^, J); {read in the data, treat as pchar}
                      for k := 0 to j - 1 do
                      begin
                        Write(f, IntToHex(Byte(p[k]), 2)); {Write byte as hex}
                        if k <> j - 1 then {not yet last byte?}
                        begin
                          Write(f, ','); {then write Comma}
                          if (k > 0) and ((k mod 25) = 0) {line too long?} then
                            Writeln(f, '\'); {then write Backslash +lf}
                        end; {if}
                      end; {for}
                      FreeMem(p, j); {free the memory}
                      Writeln(f); {Linefeed}
                    end;
                  else
                    Writeln(f, '\"\"'); {write an empty string if datatype illegal/unknown}
                end;{case}
              end; {for}
            finally
              reg.CloseKey;
            end;

          finally
            {value names all done, no longer needed}
            values.Free;
          end;

          {Now al values are written, we process all subkeys}
          {Perform this process RECURSIVELY...}
          for i := 0 to keys.Count - 1 do
            ProcessBranch(root + '\' + keys[i]);
        finally
          keys.Free; {this branch is ready}
        end;
      end; { ProcessBranch}

    begin
      if RegRoot[Length(Regroot)] = '\' then {No trailing backslash}
        SetLength(regroot, Length(Regroot) - 1);
      Assignfile(f, FileName); {create a text file}
      Rewrite(f);
      if ioResult <> 0 then Exit;
      Writeln(f, 'Windows Registry Editor Version 5.00'); {"magic key" for regedit}

      reg := TRegistry.Create;
      try
        reg.Rootkey := Rootsection;
        {Call the function that writes the branch and all subbranches}
        ProcessBranch(Regroot);
      finally
        reg.Free; {ready}
        Close(f);
      end;
    end;

    _____________________________________

    ExportRegistryBranch(HKEY_CURRENT_USER,'\Software\key\','c:\1.reg');


  • clickmaker © (04.05.09 14:17) [2]
    > если использовать SaveKey то нужно получать привелегии дополнительные
    > что уже не айс..
    > и сохраненный файл будет бинарным

    с чего бы?
    см. RegSaveKey и RegSaveKeyEx
  • Anatoly Podgoretsky © (04.05.09 14:31) [3]
    Не пойдет, ей/ему нужно в формате *.reg файла, а не двоичный формат Борланда.
  • Anatoly Podgoretsky © (04.05.09 14:34) [4]
    Хотя может это не относится к RegSaveKey, а только к SaveKey
  • Anatoly Podgoretsky © (04.05.09 14:37) [5]

    > собственно вот рабочий код если кому надо....

    Вообще то этот код не соответствует формату - ни Reg 4.0, ни Reg 5.0
 
Конференция "WinAPI" » как сохранить ветку реестра??? [D7, Win2k, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.005]