RRU*_*RUZ 10
如果您的问题是,如果您可以将资源添加到现有的exe文件,是的,这是可能的.要做到这一点,你必须使用可以的UpdateResource功能add, delete, or replace a resource in a portable executable (PE) file.
更新
{$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.
Run Code Online (Sandbox Code Playgroud)
您可以使用Colin Wilson的优秀资源实用程序.
我正在使用这个简单的控制台应用程序使用他的工具向可执行文件添加资源:
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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3655 次 |
| 最近记录: |