Как я могу извлечь ресурс в файл во время выполнения?

Я хочу распространять только один .exe, однако во время выполнения я хотел бы, чтобы он извлек некоторые встроенные ресурсы изображения на жесткий диск пользователя.

Могу ли я, и если да, то как?


person Mawg says reinstate Monica    schedule 10.09.2010    source источник


Ответы (4)


Используйте TResourceStream Delphi. Его конструктор найдет и загрузит ресурс в память, а его метод SaveToFile выполнит запись на диск.

Что-то похожее на это должно работать:

var
  ResStream: TResourceStream;
begin
  ResStream := TResourceStream.Create(HInstance, 'YOURRESOURCENAME', RT_RCDATA);
  try
    ResStream.Position := 0;
    ResStream.SaveToFile('C:\YourDir\YourFileName.jpg');
  finally
    ResStream.Free;
  end;
end;

Если вы можете использовать идентификатор ресурса вместо имени, это немного меньше памяти. В этом случае вы должны заменить Create на CreateFromID и предоставить числовой идентификатор, а не строковое имя.

person Ken White    schedule 10.09.2010
comment
Какое бы значение ни сообщила вам ОС, @Leonix. HInstance — это глобальная переменная, которую Delphi инициализирует для вас при запуске вашей программы. Он находится в модуле SysInit. - person Rob Kennedy; 10.09.2010

Создайте TResourceStream. Вам понадобится дескриптор экземпляра модуля (обычно SysInit.HInstance для текущего EXE-файла или что-то еще, что вы получите от LoadLibrary или LoadPackage), тип ресурса (например, rt_Bitmap или rt_RCData) и либо имя ресурса, либо числовой идентификатор. Затем вызовите метод потока SaveToFile.

person Rob Kennedy    schedule 10.09.2010

try
   if not Assigned(Bitmap)
   then
      Bitmap := TBitmap.Create();
   Bitmap.LoadFromResourceName(HInstance,SRC);
except
   on E:Exception do
      ShowMessage(e.Message);
end;

Затем сохраните растровое изображение на диск.

person Edelcom    schedule 10.09.2010

Возможно, это тоже может пригодиться, если вам нужно работать с самими ресурсами. Delphidabbler/ResourceFiles

person stOrM    schedule 10.09.2010