Delphi 程序如果能杀死其它进程,就能杀死自己 --- 自杀。
自杀的理由是什么呢?程序大了,代码太多,很多地方资源释放关系里不清楚(本质原因还是架构不好,再加上接口的相互引用 -- 接口相互引用的问题,现在已经有解决方案),导致程序在退出时,很可能出现 AV 错误。Duang 的一下弹一个 AV 异常窗口给用户,很不好看。因此,程序退出时,在程序员用自己的代码把该保存的数据都提交保存了以后,干脆直接自杀,进程立马死掉退出,不会去执行一些对象释放过程,也就不会有 AV 错误。
在 Windows 底下玩这些东西,必须要用到 Windows 的 API.
闲话少说,上代码:
procedure TForm1.Button1Click(Sender: TObject);
var
ProcID: DWord;
H, ProH: THandle;
S: string;
begin
{-----------------------------------------------------------------------------
这段代码测试如何用 WINDOWS API 杀死一个进程。测试通过。记事本的确被杀死了。
经过测试,也可以杀死自己。
-----------------------------------------------------------------------------}
S := Self.Caption;
H := FindWindow(0, PChar(S));
if H = 0 then
begin
ShowMessage('找不到');
Exit;
end;
GetWindowThreadProcessId(H, ProCID);
ProH := OpenProcess(PROCESS_ALL_ACCESS, True, ProcID);
TerminateProcess(ProH, 0);
end;
杀死自己,自己的句柄其实就是 Application.Handle,因此可以这样写:
procedure TForm1.Button1Click(Sender: TObject);
var
ProcID: DWord;
H, ProH: THandle;
begin
GetWindowThreadProcessId(Application.Handle, ProCID);
ProH := OpenProcess(PROCESS_ALL_ACCESS, True, ProcID);
TerminateProcess(ProH, 0);
end;
以下代码,是在我的一个正式项目里使用的,工作得非常良好:
procedure TMainClientForm.KillSelf;
var
ProcID: DWord;
H, ProH: THandle;
S: string;
begin
{-----------------------------------------------------------------------------
这段代码用 WINDOWS API 杀死一个进程。这里是杀死自己,使得程序退出简单快速。
-----------------------------------------------------------------------------}
S := Self.Caption;
H := FindWindow(0, PChar(S));
if H > 0 then
begin
GetWindowThreadProcessId(H, ProCID);
ProH := OpenProcess(PROCESS_ALL_ACCESS, True, ProcID);
TerminateProcess(ProH, 0);
end;
end;