转贴一个例子吧(只有如何加入,应用自己想吧)
=========================================================
信息标题:我知道了如何动态在EXE中加入任何资源(.EXE,.BMP,.SWF,.DOC..)大家分享一下吧!(1460字)
信息作者:crisee
发表时间:2001-8-18 11:06:00
阅读次数:363
信息内容:
前些日子,我发表了类似的帖子,是求援的。
然后,参考了些源码。经过“处心积虑”的琢磨,终于弄懂了。
本人是编程初学者,脑子也笨,高手见了不要见笑!
我发现哦,在EXE资源区内写入其它资源,虽然EXE还可运行,但图标会变成Windows默认的样儿,也就是说EXE中的ICON资源遭破坏了。然后,我尝试在EXE尾部写入资源,太棒了!虽然文件长度增加,但丝毫没有影响EXE的运行。我们假定要把 sir32.exe 加入 程序(project1.exe)中。
首先,创建新的Project,定义 private 变量 fStream:TFileStream,然后写个过程
Procedure TForm1.EXEStrore;
var FS: TFileStream;
Begin
//首先将程序自身复制为~tmp.exe
CopyFile(Application.ExeName, '~tmp.exe', false);
//为打~tmp.exe创建 fStream,模式为 只读。
fStream.Create('~tmp.exe',fmOpenRead);
//为打开sir32.exe创建 FS,模式为 只读。
FS.Create('Sir32.exe',fmOpenRead);
try
//将fStream定位至 ~tmp.exe文件尾部。
fStream.position := fStream.Seek(0, SoFromEnd);
//将 FS (sir32.exe) 定位至文件首部,准备读入内存。
FS.Postion := 0;
//将 FS(Sir32.exe) 写入 fStream(编译后的程序project1.exe)
//OK..
fStream.CopyFrom(FS, FS.Size);
finally
//释放资源,要不会出错的。
fStream.free;
FS.free;
end;
end;
以上简短的代码,就可以把任何类型的文件写入~tmp.exe中。当然,~tmp.exe只是中转站。然后在写一段用.bat文件删除程序本身,并把~tmp.exe改为程序名的代码。
如 定义 var pfile: TEXTFILE ;
begin
AssignFile(pfile,'~tmp.bat');
reWrite(pfile);
WriteLn(pfile, Pchar('Del '+Application.ExeName));
WriteLn(pfile, Pchar('ren ~tmp.exe '+Application.ExeName));
WriteLn(pfile, 'Del %0');
WriteLn(pfile, 'Exit');
CloseFile(pfile);
WinExec('~tmp.bat',SW_Hide);
Halt;
end;
最后,你会发现project1.exe文件长度增加了,具体增加的长度刚是sir32.exe的大小(一个字节也不差)。
但是,如何再把写入的文件再读出呢?自己想想,或是我下回就说 ^:^
Crisee@sina.com