如何将资源文件附加到现有的可执行文件? [英] How to attach a resource file to an existing executable file?

查看:127
本文介绍了如何将资源文件附加到现有的可执行文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个资源文件(.RES),我想将其添加到现有的可执行文件中,而无需重新编译和使用IDE!可以吗?



修改



如何解压缩资源文件?

解决方案

如果您的问题是,如果您可以向现有的exe文件添加资源,是可以的。为此,您必须使用 UpdateResource 功能,可以添加,删除或替换便携式可执行文件(PE)文件中的资源



更新



这里有一个示例代码



  {$ APPTYPE CONSOLE} 

使用
类,
Windows,
SysUtils;

procedure UpdateExeResource(Const Source,Dest:string);
var
流:TFileStream;
hDestRes:THANDLE;
lpData:指针;
cbData:DWORD;
begin
Stream:= TFileStream.Create(Source,fmOpenRead或fmShareDenyNone);
try
Stream.Seek(0,soFromBeginning);
cbData:= Stream.Size;
如果cbData> 0则
begin
GetMem(lpData,cbData);
try
Stream.Read(lpData ^,cbData);
hDestRes:= BeginUpdateResource(PChar(Dest),False);
如果hDestRes<> 0然后
如果UpdateResource(hDestRes,RT_RCDATA,'DATA',0,lpData,cbData)然后
开始
如果不是EndUpdateResource(hDestRes,FALSE)然后RaiseLastOSError
end
else
RaiseLastOSError
else
RaiseLastOSError;
finally
FreeMem(lpData);
结束
结束
finally
Stream.Free;
结束
结束

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');
除了
在E:Exception do
Writeln(E.ClassName,':',E.Message);
结束
结束。


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

And how to extract the resource file?

解决方案

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.

这篇关于如何将资源文件附加到现有的可执行文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆