How to attach a resource file to an existing executable file?

前端 未结 3 1327
猫巷女王i
猫巷女王i 2021-01-02 06:33

I have a resource file(.RES) and i want to add it into an existing executable file without recompiling and using the IDE! is it possible?

Edit

3条回答
  •  走了就别回头了
    2021-01-02 07:08

    If your question is, if you can add a resource to a existing exe file, yes it is possible. To do this you must use the UpdateResource function which can add, delete, or replace a resource in a portable executable (PE) file.

    update

    Here you have a sample code

    {$APPTYPE CONSOLE}
    
    uses
      Classes,
      Windows,
      SysUtils;
    
    procedure UpdateExeResource(Const Source,Dest:string);
    var
      Stream     : TFileStream;
      hDestRes   : THANDLE;
      lpData     : Pointer;
      cbData     : DWORD;
    begin
      Stream := TFileStream.Create(Source,fmOpenRead or fmShareDenyNone);
      try
        Stream.Seek(0, soFromBeginning);
        cbData:=Stream.Size;
        if cbData>0 then
        begin
          GetMem(lpData,cbData);
          try
            Stream.Read(lpData^, cbData);
            hDestRes:= BeginUpdateResource(PChar(Dest), False);
            if hDestRes <> 0 then
              if UpdateResource(hDestRes, RT_RCDATA,'DATA',0,lpData,cbData) then
              begin
                if not EndUpdateResource(hDestRes,FALSE) then RaiseLastOSError
              end
              else
              RaiseLastOSError
            else
            RaiseLastOSError;
          finally
            FreeMem(lpData);
          end;
        end;
      finally
        Stream.Free;
      end;
    end;
    
    begin
      try
        UpdateExeResource('C:\Users\Dexter\Documents\RAD Studio\Projects\Debug\Win32\Data.txt','C:\Users\Dexter\Documents\RAD Studio\Projects\Debug\Win32\project86.exe');
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
    

提交回复
热议问题