我想终止一个Delphi应用程序而不执行任何其他代码行,并且我想知道正确的做法是什么。此外,我想知道目前我正在做的事情是否有问题。 基本上,我的代码看起来像这样:
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
这样停止 Delphi 应用程序的方式正确吗?还是应该用其他方法?
Application.Terminate()
会中断在TApplication.Run()
和TForm.ShowModal()
中的消息循环,使主线程能够正常退出、执行必要的清理等操作。
Vcl.Forms.TApplication.Terminate
结束应用程序的执行。
调用
Terminate
来以编程方式结束应用程序。通过调用Terminate
而不是释放应用程序对象,可以允许应用程序有序地关闭。
Terminate
调用Windows API的PostQuitMessage
函数来执行应用程序的有序关闭。Terminate
不是立即生效的。Terminate
在收到WM_QUIT消息和主窗体关闭时会自动调用。
Halt()
则是一种立即异常终止的方法。基本上,它会将进程从内存中强制移除。只有在没有其他选项可用的极端情况下才使用它。
启动程序的异常终止。
Halt
执行程序的异常终止,并返回到操作系统。要对Delphi应用程序进行正常关闭,请调用全局
Application
对象上的Terminate
方法。如果应用程序不使用提供Application
对象的单元,请从主Program块调用Exit
过程。
我想要终止一个 Delphi 应用程序,而不执行任何其他代码。
Application.Terminate
和 Halt
都无法达到这个目的。前者会执行有序终止,许多代码将被执行。调用 Halt
更有希望。那是一种异常终止。但是单元终结代码会被执行。
如果您希望尽可能快地退出,并在此过程中执行最少量的代码,请调用 ExitProcess
。那是 Halt
的最后一步,通过直接调用 ExitProcess
,您可以避免 Halt
在调用 ExitProcess
之前执行的所有步骤。
我在使用Application.Terminate时遇到了一些问题,因为我需要启动窗体关闭程序,所以我只做了以下操作:
Form1.Close;
我在 .dproj 文件中发现了一个新的解决方案
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.CreateForm(TFormMain, FormMain);
if Not(VerifyCode()) then
begin
ShowMessage('Software unregistered!');
Application.Terminate;
end
else
Application.Run;
end.
VerifyCode
是否正确,只有在正确的情况下才创建主窗体,这样不是更好吗?Application.Terminate
会离开事件循环,而Application.Run
则进入事件循环。换句话说,Application.Terminate
应该从某个事件处理程序中调用,而不能直接从主过程中调用。 - undefined如果代码必须放在主表单的OnCreate事件中,请尝试以下代码。但是,它并不能按预期工作,主表单会显示,然后应用程序就会结束。
要能够看到效果,请添加另一个窗体并在其创建时加入一个长循环。
似乎所有主项目源文件中的Application.CreateForm都被执行了。
示例代码:
procedure TMyMainForm.FormCreate(Sender: TObject);
begin
ShowMessage('[1] This must allways be shown');
if mrOK=MessageDlg('Exit?',mtConfirmation,[mbOK,mbCancel],0)
then begin
Application.Terminate;
Exit;
end;
ShowMessage('[2] This must not allways be shown');
end;
procedure TMyOtherForm.FormCreate(Sender: TObject);
begin
ShowMessage('[3] This must not allways be shown');
end;
使用该代码消息[1]和[3]总是显示。
仅通过调用Halt来不显示[3]。
注意:为什么在MainForm OnCreate上编写这样的代码?简单的答案可能是,exe检查是否满足运行条件并且发现它们没有满足(缺少文件等)。粗鲁的答案(抱歉),只是因为我想要/需要这样做。
我知道这是一个旧的帖子,但如果还有人在关注,我会很感激对这个帖子的补充意见。
相当长一段时间以来,我一直调用Application.Terminate,然后是ExitProcess(0)。我的理论是Application.Terminate可以进行优雅的清理,而ExitProcess则可以防止任何其他代码执行。它似乎有效,并且我没有收到内存泄漏或其他不良影响的报告。代码可能如下:
Procedure (KillTheApp);
begin
Application.Terminate;
Application.ProcessMessages;
ExitProcess(0);
end;
关于dll
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,False,GetPIDbyProcessName(ExtractFileName(ParamStr(0)))),0);
Application.MainForm.Close;
进行关闭。 - Sir RufoApplication.Terminate
,因此在需要时可以直接调用它。但是,请注意它只能在主线程的上下文中调用,而不能在工作线程中调用。 - Remy LebeauApplication.MainForm.Close
时,不仅会调用Application.Terminate
,而且还会处理主窗体的OnCloseQuery
和OnClose
事件(如果已分配)。您甚至可以通过将OnCloseQuery
事件的CanClose
变量设置为false来防止应用程序关闭。但是,调用Application.Terminate
不会处理这些事件。 - SilverWariorApplication.Terminate;
后使用Exit;
而不是Halt;
。 - crefirdExit
仅仅是离开当前的函数或过程,它不会有任何其他操作。顺便说一下,它不应该与C标准库中的exit
函数混淆。 - undefined