2
\$\begingroup\$

I have developed this function but I'm not sure if this is the best (secure) way to write in resources without corrupt *.exe in case of fails.

What is the best way to write resources to a *.exe file?

procedure SaveToRes(const aResFileName, aResName: string; aMemoryStream : TMemoryStream);
var
   myRes: THandle;
   aUpdateResource : boolean;
begin
   aUpdateResource := false;

   if not(FileExists(aResFileName)) then
     raise Exception.Create('File not found');

   myRes := BeginUpdateResource(PChar(aResFileName),false);

   if myRes = 0  then
     raise Exception.Create('BeginUpdateResource');

   try
      aMemoryStream.Seek(0,0);

      aUpdateResource := UpdateResource(myRes, RT_RCDATA, PChar(aResName), LANG_NEUTRAL, aMemoryStream.Memory, aMemoryStream.Size);

      if not(aUpdateResource) then
         RaiseLastOSError(GetLastError, '[UpdateResource]');

   finally
      if not(EndUpdateResource(myres, not(aUpdateResource))) then
         RaiseLastOSError(GetLastError, '[EndUpdateResource]');
   end;
end;

Usage:

var 
    aVal          : LongInt;
    aMemoryStream : TMemoryStream;
begin
    aVal := 5;

    aMemoryStream := TMemoryStream.create;

    try
        aMemoryStream.Write(aVal, sizeOf(aVal));

        SaveToRes('C:\foo\bar.exe', 'myRes', aMemoryStream);
    finally
        aMemoryStream.free;
    end;
end;
\$\endgroup\$

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.