动态的添加资源文件到可执行程序中(解决者再送200分)

xiaoxingchi 2010-12-13 05:27:52
有没有方法可以动态的添加资源文件到指定的可执行程序中?

如:
在目标程序A.exe中添加,ICON资源 aa.ico。不是替换,是添加。

在目标程序B.exe中添加,声音和EXE文件资源 b.wav 和 1.exe。

然后在目标程序中调用!

提供代码者可再加分!!
...全文
434 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxingchi 2010-12-15
  • 打赏
  • 举报
回复
试了一下,确实成功了。谢谢!
keeley20 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiaoxingchi 的回复:]

引用 10 楼 keeley20 的回复:

引用 8 楼 xiaoxingchi 的回复:

按照4楼的朋友提供的方法,参照C++的代码。

修改代码如下:但是不成功,请指教!
Delphi(Pascal) code
function ChangeExeRDATA(RDATAFile, ExeFile: string): Boolean;
var
Lpbuffer: PBY……
[/Quote]

测试了下楼主自己的代码,把 MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)换成0也是成功的。
xiaoxingchi 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 keeley20 的回复:]

引用 8 楼 xiaoxingchi 的回复:

按照4楼的朋友提供的方法,参照C++的代码。

修改代码如下:但是不成功,请指教!
Delphi(Pascal) code
function ChangeExeRDATA(RDATAFile, ExeFile: string): Boolean;
var
Lpbuffer: PBYTE;
hUpdate: DWORD;
nSi……
[/Quote]

没报错,就是用不了。

你的方法可以。
xiaoxingchi 2010-12-14
  • 打赏
  • 举报
回复
UpdateResourceW(update,PWideChar(RT_RCDATA),'ICORes',0,mstrm1.Memory,mstrm1.Size);

搞定了。。想要能FindResource

ICORes 必须全部大写!
keeley20 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiaoxingchi 的回复:]

按照4楼的朋友提供的方法,参照C++的代码。

修改代码如下:但是不成功,请指教!
Delphi(Pascal) code
function ChangeExeRDATA(RDATAFile, ExeFile: string): Boolean;
var
Lpbuffer: PBYTE;
hUpdate: DWORD;
nSize, nGSize: DWORD;
hFile: THand……
[/Quote]
你报的什么错误?你这段代码和我的代码功能基本一样,可以试试我的代码。
xiaoxingchi 2010-12-14
  • 打赏
  • 举报
回复
ok了。6楼的方法可以
xiaoxingchi 2010-12-14
  • 打赏
  • 举报
回复
按照4楼的朋友提供的方法,参照C++的代码。

修改代码如下:但是不成功,请指教!
function ChangeExeRDATA(RDATAFile, ExeFile: string): Boolean;
var
Lpbuffer: PBYTE;
hUpdate: DWORD;
nSize, nGSize: DWORD;
hFile: THandle;
dwReserved: DWORD;
ret: Boolean;
begin
Result := False;
hFile := CreateFile(PChar(RDATAFile), GENERIC_READ, 0, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if hFile = INVALID_HANDLE_VALUE then Exit;

try
nSize := GetFileSize(hFile,nil);
GetMem(Lpbuffer, nSize);
if ReadFile(hFile, Lpbuffer^, nSize, dwReserved, nil) = False then exit;
hUpdate := BeginUpdateResource(PChar(ExeFile), False);
try
ret := UpdateResource(hUpdate, RT_RCDATA, MAKEINTRESOURCE(10), MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), Lpbuffer, nSize);
finally
EndUpdateResource(hUpdate, False);
end;
finally
CloseHandle(hFile);
end;

Result := ret;
end;
dd_zhouqian 2010-12-14
  • 打赏
  • 举报
回复
主要还是解决如何在内存中运行exe
楼主可以参考下delphi社区的帖子
不过上次mark的帖子,没找到,有些郁闷

楼主可以参考这篇博文对你有所帮助
http://blog.csdn.net/imho888/archive/2009/02/12/3880650.aspx
keeley20 2010-12-14
  • 打赏
  • 举报
回复

procedure TForm1.Button1Click(Sender: TObject);
var
mstrm1:TMemoryStream;
update : dword;
workdir:string;
begin
workdir := ExtractFilePath(ParamStr(0));
mstrm1 := TMemoryStream.Create;
mstrm1.LoadFromFile(workdir+'\add.ico');//要添加的图标
mstrm1.Seek(0,soFromEnd );
mstrm1.Position :=0;
CopyFile(PChar(workdir+'\test.exe'),PChar(workdir+'\test_add.exe'),True );
update := BeginUpdateResourceW(PWideChar(widestring(workdir+'\test_add.exe')),False);
UpdateResourceW(update,PWideChar(RT_RCDATA),'ICORes',0,mstrm1.Memory,mstrm1.Size);
EndUpdateResourceW(update ,False);
mstrm1.Free;
ShowMessage('配置完成了');
end;

其中
BeginUpdateResourceW( LPCSTR pFileName, BOOL bDeleteExistingResources )
参数一 LPCTSTR pFileName, // 可执行文件名
参数二 BOOL bDeleteExistingResources // 是否删除可执行文件的现有资源

update := BeginUpdateResourceW(PWideChar(widestring(workdir+'\test_add.exe')),False); //false就是增加资源。

添加其他资源基本和这差不多,然后楼主说要在目标程序中利用,那你这个程序中首先就得写代码,假如你的意思是工具A既要向目标A添加图标资源,又得添加利用该图标资源的代码,这个是很难实现的。

事先写代码是比较好的,可以遍历资源,如有资源名符合的就利用,没有则跳过。
  • 打赏
  • 举报
回复
BeginUpdateResource
UpdateResource
EndUpdateResource

楼主可以去百度百科查看下。
lengfengxiaodao 2010-12-13
  • 打赏
  • 举报
回复
这种修改PE文件就可以的
George-Vick 2010-12-13
  • 打赏
  • 举报
回复
当然方法不少,百度搜就是,还搞不定,到时候发代码给我
George-Vick 2010-12-13
  • 打赏
  • 举报
回复
动态添加资源方法也不少
var FIcon:TIcon;
begin
FIcon:=TIcon.create;
FIcon.handle:=LoadFromfile('d:\aa.ico');
FIcon.free;
这是加载文件做法,也可以用RES资源文件,用LOADIcon方法或者steam的方法去加载,参照这个
谈资源文件在Delphi中的应用
资源文件一般为扩展名为res的文件。在VC中资源文件用得非常普遍,
但Delphi在其联机帮助中对资源文件没作什么介绍,其实利用其自带的
资源编译工具BRCC32.EXE(一般位于\Delphi\BIN目录下),我们完全可
以做出跟VC一样效果的文件来。\\
资源文件最大的好处是能将一些在必要时才调用的文件跟可执行文件一
起编译,生成一个文件.这样做最大的好处就是使外部文件免遭破坏.例如
在一条程序中你要临时调用一幅图片,一般作法是把图片放在某一路径下
(通常是主程序所在路径),但如果用户路径误删你的图片文件,则可能
使程序找不到相应文件而出错崩溃。另外,如果你想自己的程序界面美观,
想用一些自定义光标,也要用到资源文件。
资源文件的使用步骤为:
1.编写rc脚本文本
用记事本或其它文本编辑器编写一个扩展名为rc的文件。例如:
mycur cursor move.cur //加入光标
mypic Bitmap Water.BMP //加入位图
mywav WAVE happy.wav //加入声音
myAVI AVI EPOEN.AVI //加入视频
myIco ICON CJT.ICO //加入图标
格式分别为在资源文件中的名称-> 类型-> 实际文件名称,例如上面
第一行 定义一个名为mycur的光标,实际名称为加入光标move.cur.
2.将rc文件编译成res资源文件
将脚本文件和实际文件拷到Brcc32.EXE所在目录,执行DOS命令。
格式为:Brcc32 脚本文件(回车),例如有一名为myfirst.rc的脚本文件,
则执行 Brcc32 myfirst.rc(回车)即可。如果你是懒人,也可新建一批
处理文件,内容 只有一行:Brcc32 mufist.rc.(因为Delphi安装后一般会
在自动批处理文件中指明搜索路径的。)如果编译成功,则会生成一个结尾
为res的文件,这个 文件就是我们需要的资源文件。
3.在Delphi单元中加入资源文件
将生成的res资源文件拷贝到你所编程序的路径下,在单元文件
{$R *DFM}后加上一句{$R mufirst.res},则将res文件加入去,编译后资
源文件即已包含在可执行文件中了。若你有多个资源文件,也按上法依次
加入。
4.在Delphi程序中调用资源文件
资源文件在Delphi中的关键字为hinstance.下面给出具体用法
<1> 光标的调用
首先在程序中定义一个值大于0的常量,因为Delphi本身用0-负
16来索引 默认的光标,所以我们制定的光标应从表面上1开始索引。然后
在窗口的Oncreat事件中添加以下代码:
screen.cursor[35]:Load cursor (hinstance, 'mycur ');
其中35为大于1的常量,mycur为光标在资源文件中的名字。如
果希望在 其他控件上使用定制光标,例如Panel控件,只需在程序的适当
处加入以下代码:
Panel1.cursor:=35;
<2> 位图的调用
新建一项工程,添加一Timage控件,在需要显示的地方写以下代码:
Var mymap:Hbitmap;
begin
hmymap:=LoadBitmap(hinstance, 'mypic ');
Image1.picture.Bitmap.Handle:=mymap;
end;
其中 "mypic "为位图资源文件中的名称。
〈3〉AVI文件的调用
新建一工程,添加一Animate控件,在需要的地方加入:
animater1.resname:= 'myAVI ';
animater1.Active:=true;
其中myAVI为视频文件在资源文件中的名称。
〈4〉调用WAV文件
在uses中加入mmsystm单元,以便在程序中播放WAV文件。播放时Playsound
(pchar( 'mywav '),hinstance,sndsync or snd_resource);其中mywav为声音
文件在资源中的名称。
〈5〉加入光标
加入光标比较容易,只要将res文件加入单元文件中即可。但需注意,名称
最好取 "W ". "WW "等,使第一个字母尽量靠后,以免与主程序的图标顺序颠倒。
补充:1.资源类型除上述类型外,还可以字体文件,字符串文件等。
2.资源文件不但可以在标准图形界面下使用还可在控制台下使用。
下面我们来试验一下:
新建一工程,将唯一的一个Form删除,然后修改工程文件。增加一句
{$Apptype console},在uses子句中加入mmsystem,并将其它引用单元
删掉。将Begin和end之间语句删掉。至此,我们就可和Turbo PASCAL
下编程序一样,且还可以调用windows的API和资源。将资源文件----
{$R myfist.res}加入。在Begin和end之间写下:
writeln( '演示程序,按任意键开始! ');
readln;
playsound(pchar( 'mywav '),hinstance,snd_sync or snd_resource);
writeln( '演示结束! ');
运行程序,将弹出一个标准DOS窗口,按任意键播放声音文件。是不是很COOL呢!
我曾下载过一个播放器,在其安装目录下我发现有一 "DOS程序 ",用鼠标双击它
便弹出一个DOS窗口,显示DOS时代特有的画图,并有背景音乐!可能就是用这个
方法做的。

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧