Mawg
Mawg

Reputation: 40215

How can I extract a resource into a file at runtime?

I want to distribute only a single .exe, however, at runtime I would like it to extract some embedded image resources to the users hard disk drive.

Can I, and if so, how?

Upvotes: 13

Views: 15109

Answers (4)

stOrM
stOrM

Reputation: 103

Maybe this might come in handy too if you need to work with the resources itself. Delphidabbler / ResourceFiles

Upvotes: 1

Edelcom
Edelcom

Reputation: 5058

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

And then save the Bitmap to disk.

Upvotes: 2

Rob Kennedy
Rob Kennedy

Reputation: 163357

Create a TResourceStream. You'll need the module instance handle (usually SysInit.HInstance for the current EXE file, or else whatever you get from LoadLibrary or LoadPackage), the resource type (such as rt_Bitmap or rt_RCData), and either the resource name or numeric ID. Then call the stream's SaveToFile method.

Upvotes: 4

Ken White
Ken White

Reputation: 125757

Use Delphi's TResourceStream. It's constructor will find and load the resource into memory, and it's SaveToFile method will do the disk write.

Something similar to this should work:

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;

If you can use the resource ID instead of name, it's a little less memory. In that case, you'd resplace Create with CreateFromID, and supply the numeric ID rather than the string name.

Upvotes: 20

Related Questions