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

前端 未结 3 1344
猫巷女王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 06:45

    You can use Colin Wilson's excellent Resource Utilities.

    I'm using this simple console application to add a resource to an executable using his tools:

    program AddResource; 
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils,
      Classes,
      unitNtModule,
      unitResFile,
      unitResourceRCData;
    
      procedure AddRes(exeName, resName: string);
      var
        exeModule: TNTModule;
        resFile  : TResModule;
      begin
        if ExtractFileExt(exeName) = '' then
          exeName := ChangeFileExt(exeName, '.exe');
        exeModule := TNTModule.Create;
        try
          exeModule.LoadFromFile(exeName);
          resFile := TResModule.Create;
          resFile.LoadFromFile(resName);
          exeModule.AddResource(resFile.ResourceDetails[0]);
          exeModule.SaveToFile(exeName);
        finally FreeAndNil(exeModule); end;
      end; { AddRes }
    
    begin
      if ParamCount <> 2 then
        Writeln('Usage: AddResource <exe file> <resource file>')
      else
        AddRes(ParamStr(1), ParamStr(2));
    end.
    
    0 讨论(0)
  • 2021-01-02 07:00

    This is my answer : (Thank you PRUZ)

    Uses Classes, Windows, SysUtils, Dialogs;
    
    Type
      TBuffer = Array[0..0] of Byte;
      PBuffer = ^TBuffer;
    
    Var
      FS             : TFileStream;
      ResourceHandle : THandle;
      DataLength     : DWord;
      Data           : PBuffer;
      Ok             : Boolean;
    
    Begin
       ResourceHandle := BeginUpdateResource(pChar('d:\someexefile.exe'), False);
       IF (ResourceHandle <> 0) Then
       Begin
          FS := TFileStream.Create('d:\somebitmap.bmp', fmOpenRead);
          FS.Seek(0, soFromBeginning);
          DataLength := FS.Size;
          GetMem(Data, DataLength);
          FS.Read(Data^, DataLength);
          FS.Free;
    
          Ok := True;
          IF (not UpdateResource(ResourceHandle, RT_RCDATA, pChar('MyNewResource'), LANG_SYSTEM_DEFAULT{MakeLangID(LANG_NEUTRAL, SUBLANG_NEUTRAL)}, Data, DataLength)) Then Ok := False;
    
          IF (not EndUpdateResource(ResourceHandle, False)) Then Ok := False;
    
          IF (Ok) Then ShowMessage('Update of resources successful!')
             Else ShowMessage('Update of resources failed!');
    
          FreeMem(Data);
       End;
    End. 
    

    Reference : http://www.delphi3000.com

    0 讨论(0)
  • 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.
    
    0 讨论(0)
提交回复
热议问题