Сохранение бинарного файла в реестре с последующим его извлечением

Материал из DRKB

Сохранение бинарного файла в реестре с последующим его извлечением[править | править код]

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Сохранение бинарного файла в реестре с последующим его извлечением

Функции позволяют разбить файл на блоки 16к и затем поместить бинарные
данные в реестр, а так же собрать эти данные обратно в файл при необходимости.
Не знаю зачем этот код нужен , но возможно он пригодится для скрытого
хранения данных . Не рекомендуется (!) сохранять слишком большие файлы
в реестре , потому что размеры реестра ограничены .

Зависимости: Registry,SysUtils

Copyright:   KosilkA
Дата:        4 декабря 2003 г.
***************************************************** }

//////////////////////////////////////////////////
// функция разбивки и сохранения файла в реестр:

function SaveToRegistry(RootKey: HKEY; FileName, KeyName: string): Bool;
// где RootKey-раздел реестра,
// FileName-путь к файлу ,
// KeyName-ключ реестра в который будем сохранять
var
  FromF: file;
  NumRead, i: Integer;
  Buf: array[0..16383] of byte;
  reg: TRegistry;
begin
  try
    AssignFile(FromF, FileName);
    Reset(FromF, 1);
    reg := TRegistry.Create;
    reg.RootKey := RootKey;
    if reg.OpenKey(KeyName, True) = False then
    begin
      // если невозможно открыть ключ с правами записи , то что то не так
      Result := False;
      reg.Free;
      exit; // выходим
    end;
    i := 0;
    repeat // читаем и записываем в цикле
      BlockRead(FromF, Buf, SizeOf(Buf), NumRead); // читаем блок из файла
      if NumRead <> 0 then
      begin
        reg.WriteBinaryData(IntToStr(i), buf, NumRead); // сохраняем блок в реестр
        Inc(i);
      end;
    until (NumRead = 0);
    CloseFile(FromF);
    reg.CloseKey;
    reg.Free;
    Result := True;
  except
    reg.CloseKey;
    reg.Free;
    Result := False;
  end;
end;

//////////////////////////////////////////////////
// функция сборки сохраненного файла:

function BuildFromRegistry(RootKey: HKEY; KeyName, ToFileName: string): Bool;
// где RootKey - раздел реестра,
// KeyName - ключ реестра,
// ToFileName - имя выходного файла.
var
  NumWritten, i: Integer;
  ToF: file;
  Buf: array[0..16383] of byte;
  reg: TRegistry;
begin
  try
    AssignFile(ToF, ToFileName);
    Rewrite(ToF, 1);
    reg := TRegistry.Create;
    reg.RootKey := RootKey;
    if not reg.OpenKey(KeyName, True) then
    begin
      // если указанный ключ невозможно открыть - выходим
      Result := False;
      reg.Free;
      exit;
    end;
    i := 0;
    repeat
      // в цикле находим значения начиная с "0", читаем их
      // и добавляем блоки к файлу
      if reg.ValueExists(IntToStr(i)) then
      begin
        reg.ReadBinaryData(IntToStr(i), buf, reg.GetDataSize(InTtoStr(i)));
        BlockWrite(ToF, Buf, reg.GetDataSize(IntToStr(i)));
      end;
      Inc(i);
    until not reg.ValueExists(IntToStr(i));
    CloseFile(ToF);
    reg.CloseKey;
    reg.Free;
    Result := True;
  except
    reg.CloseKey;
    reg.Free;
    Result := False;
  end;
end;


// Пример использования:

// сохранить:
SaveToRegistry(HKEY_CURRENT_USER, Application.ExeName, '\Software\MyData\test');

// извлечь:
BuildFromRegistry(HKEY_CURRENT_USER, '\Software\MyData\test', 'MyBuildApp.exe');


Author: Sergey, gloom@imail.ru, Koenigsberg
Source: http://delphibase.endimus.com
ID: 02291