========================================================= 信息标题:我知道了如何动态在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) /.. 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的大小(一个字节也不差)。 但是,如何再把写入的文件再读出呢?自己想想,或是我下回就说 ^:^ -----------------------------------------------要改一下。 我前几天刚做了。 后来删了demo