Как я могу извлечь ресурс в файл во время выполнения? - PullRequest
11 голосов
/ 10 сентября 2010

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

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

Ответы [ 4 ]

18 голосов
/ 10 сентября 2010

Используйте Delphi's TResourceStream. Его конструктор найдет и загрузит ресурс в память, а метод 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 и указать числовой идентификатор, а не имя строки.

4 голосов
/ 10 сентября 2010

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

2 голосов
/ 10 сентября 2010
try
   if not Assigned(Bitmap)
   then
      Bitmap := TBitmap.Create();
   Bitmap.LoadFromResourceName(HInstance,SRC);
except
   on E:Exception do
      ShowMessage(e.Message);
end;

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

1 голос
/ 10 сентября 2010

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

...