如何实现:卸载程序中删除自己并把父级目录删除(50分)

  • 主题发起人 主题发起人 xgwzw
  • 开始时间 开始时间
写到系统目录下一个bat文件,在里面删除目录及自身
 
del "F:/test/Project1.exe"
if exist "F:/test/Project1.exe" goto try
rd F:/test
del %0

这种方式测试失败,不可以删除程序Project1.exe和目录分f:/test
 
没有见到很多程序需要关闭甚至是重启后才能删除程序,
先将写到AUTOEXEC.BAT中,然后关闭后重启后删除,或用另外一个程序监视......
 
1,好象在那里看到说要先把删除的东西写入内存,然后执行来删除本身程序,反正很高深,我没弄懂。
2,你使用安装包开发工具很简单就可以实现这一点啊(比如INNO SETUP)
 
procedure TForm_sysupdate.BitBtn1Click(Sender: TObject);
var
Ts : TStringList;
begin
Ts := TStringList.Create;
Ts.Add('@echo off');
Ts.Add('ping 0.0.0.1 -n 1 -w 500>nul');
//Ts.Add('rd F:/test');
Ts.Add('del ' + Application.ExeName);
Ts.Add('del %0');
Ts.SaveToFile(Application.ExeName + '.bat');
Ts.Free;
Shellexecute(handle,'Open',PChar(Application.ExeName + '.bat'),'',nil, SW_HIDE);
Application.Terminate;
end;
 
用 Inno Setup 做安装文件,里面有一个 UninstallDelete 字段,在里加上就可以了
 
说实在话这么做很危险,好像超级解霸当年就出过这样的问题,不是每个用户都老老实实的默认安装,也有些用户直接把程序安装到根目录
 
to QSmile,
请问如何自己编码实现,
to
skadon,
删除不了父目录啊
 
del %0 必须放在最后一行
要删除目录,这个.bat文件得放在别处,不能放在要删除的目录里面
 
var
Ts : TStringList;
begin
renamefile(application.ExeName,application.ExeName+'.tmp');
Ts := TStringList.Create;
Ts.Add('@echo off');
Ts.Add('rmdir '+extractfiledir(application.ExeName)+'/q/s');
Ts.SaveToFile(Application.ExeName + '.bat');
Ts.Free;
Shellexecute(handle,'Open',PChar(Application.ExeName + '.bat'),'',nil, SW_HIDE);

别忘了给我加分哦!其实用rmdir最好的,删除正在运行的程序 WINDOWS是不允许,但是我们先修改名称就可以删除了!
 
我有一段汇编代码,是删除exe自身的
还有一段代码是在内存中启动exe的
 
to all:
上面的测试没有通过,不知道你们测过没有
 
WIN2000 ADV版,通过

procedure TForm1.BitBtn1Click(Sender: TObject);
var
Ts : TStringList;
begin
Ts := TStringList.Create;
Ts.Add('@echo off');
Ts.Add('ping 0.0.0.1 -n 1 -w 100>nul');
Ts.Add('del ' + Application.ExeName);
Ts.Add('CD /');
Ts.Add('RD '+ExtractFileDir(Application.ExeName));
Ts.Add('del %0');
Ts.Add('exit');
Ts.SaveToFile('C:/'+ExtractFileName(Application.ExeName) + '.bat');
Ts.Free;
Shellexecute(Handle,'Open',PChar('C:/'+ExtractFileName(Application.ExeName) + '.bat'),'',nil, SW_HIDE);
Application.Terminate;
end;
 
to skadon
测试通过,谢谢!
Ts.Add('ping 0.0.0.1 -n 1 -w 100>nul');这是什么意思啊?不是很明白!
 
Ts.Add('ping 0.0.0.1 -n 1 -w 100>nul');
延迟.bat开始执行时间

Shellexecute(Handle,'Open',PChar('C:/'+ExtractFileName(Application.ExeName) + '.bat'),'',nil, SW_HIDE);

//延迟100毫秒,否则可能Application未释放完毕,.bat已经开始执行了,达不到效果,如果Application释放需要较长时间,则需要增大延迟时间。

Application.Terminate;
 
接受答案了.
 
to skadon
刚才给分错误!另外开贴给分,谢谢!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3492396
还有其它兄弟要分的话,再开50分!
 
后退
顶部