Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , ОС и Железо , Реестр

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

Автор: Sergey
WEB-сайт: http://delphibase.endimus.com

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

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

Зависимости: Registry,SysUtils
Автор:       Sergey, gloom@imail.ru, Koenigsberg
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 reg.OpenKey(keyname, true) = false then
      //если указанный ключ невозможно открыть - выходим
    begin
      result := false;
      reg.Free;
      exit;
    end;
    i := 0;
    repeat
      //в цикле находим значения
      //начиная с "0" , читаем их
      //и добавляем блоки к файлу
      if reg.ValueExists(inttostr(i)) = true then
      begin
        reg.ReadBinaryData(inttostr(i), buf, reg.GetDataSize(inttostr(i)));
        BlockWrite(ToF, Buf, reg.GetDataSize(inttostr(i)));
      end;
      inc(i);
    until reg.ValueExists(inttostr(i)) = false;
    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');

Обзор кода

Код состоит из двух функций:

  1. SaveToRegistry: Функция принимает три параметра:
    • RootKey: Корневой ключ в реестре, где будет храниться данные.
    • FileName: Путь к бинарному файлу, который нужно сохранить.
    • KeyName: Имя ключа в реестре, где будет храниться данные. Функция читает бинарный файл блоками по 16 КБ, записывает каждый блок в реестр с помощью временного объекта реестра (tregistry), а затем освобождает объект реестра после выполнения.
  2. BuildFromRegistry: Функция принимает три параметра:
    • RootKey: Корневой ключ в реестре, где хранится данные.
    • KeyName: Имя ключа в реестре, содержащего данные для извлечения.
    • ToFileName: Путь к файлу вывода, куда будет записано извлеченное данные.

Функция итерирует по значениям в реестре, читает каждое значение как бинарный блок, и записывает его в файл вывода с помощью временного объекта файла (ToF).

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

В разделе примера использования можно увидеть, как использовать эти функции:

  • SaveToRegistry: Сохранить бинарный файл (например, исполняемый файл) в реестре под ключом \Software\MyData\test.
  • BuildFromRegistry: Извлечь сохраненные данные из реестра и записать их в новый файл с именем MyBuildApp.exe.

Замечания

  • Код использует встроенный модуль Delphi Registry, который предоставляет функции для работы с Windows-реестром.
  • Код предполагает, что бинарный файл не слишком велик, чтобы поместиться в памяти. Если вам нужно обрабатывать большие файлы, вам может потребоваться более эффективный алгоритм или реализация буферизации.
  • В целом, хранение больших объемов данных в реестре не рекомендуется, так как это может привести к проблемам с производительностью и коррупцией данных.

Сохранение бинарного файла в реестре с последующим его извлечением позволяет разбить файл на блоки 16к и поместить бинарные данные в реестр, а также собрать эти данные обратно в файл при необходимости.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Реестр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:30:41/0.0056757926940918/1