很多时候(例如你想做一些恶意的事情)你需要程序执行后自动删除。我们知道,在程序执行的过程中,我们是无法删除它的。那么怎么做呢?很简单,在它结束并释放资源之后删除它。
一个简单的办法是使用批处理文件,在程序结束的时候生成一个批处理文件,此文件的信息就是尝试删除指定的程序。
一个在DELPHI下删除自身的例子:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
...{ Private declarations }
public
...{ Public declarations }
end;
var
Form1: TForm1;
implementation

...{$R *.DFM}
procedure DeleteMe;//删除自身的过程
var
BatchFile: TextFile;//定义一个文本文件
BatchFileName: string;//文件名
ProcessInfo: TProcessInformation;
StartUpInfo: TStartupInfo;
begin
BatchFileName := ExtractFilePath(ParamStr(0)) + '_deleteme.bat';
//写一个删除指定程序的.bat文件
AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile, ':try');
Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
Writeln(BatchFile,
'if exist "' + ParamStr(0) + '"' + ' goto try');
Writeln(BatchFile, 'del %0');
CloseFile(BatchFile);
//执行这个文件
FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil, PChar(BatchFileName), nil, nil,
False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
ProcessInfo) then
begin
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DeleteMe;
close;
end;
end.
注:WINXP+D7下测试通过。
770




被折叠的 条评论
为什么被折叠?



