很多时候(例如你想做一些恶意的事情)你需要程序执行后自动删除。我们知道,在程序执行的过程中,我们是无法删除它的。那么怎么做呢?很简单,在它结束并释放资源之后删除它。
一个简单的办法是使用批处理文件,在程序结束的时候生成一个批处理文件,此文件的信息就是尝试删除指定的程序。
一个在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.
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下测试通过。