Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007
{ **** 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');