你可能會認爲這是一個愚蠢的問題,但我很好奇如何終止我的delphi製作的應用程序與APPCRASH錯誤。 (也被稱爲「不發送」錯誤!)如何在Delphi應用程序中調用APPCRASH事件?
日Thnx提前
你可能會認爲這是一個愚蠢的問題,但我很好奇如何終止我的delphi製作的應用程序與APPCRASH錯誤。 (也被稱爲「不發送」錯誤!)如何在Delphi應用程序中調用APPCRASH事件?
日Thnx提前
你可以通過設置全局變量,JITEnable,在系統啓用此功能。如果將其設置爲1,則所有外部異常(即訪問違規,非法指令以及任何非Delphi異常)都會觸發您想要的反應。如果將其設置爲2,則的任何異常都會觸發該行爲。無論哪種情況,只有當您調試應用程序時,纔會發生而不是。調試器將始終得到第一個裂縫,並會通知您即將到來的厄運。這裏有一個簡單的例子:
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
try
JITEnable := 2;
raise Exception.Create('Error Message');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
它的工作原理,但它只有一個問題。應用程序阻塞,當我們想關閉它時,我們不能(除了使用任務管理器)。儘管它看起來像標準答案,但我並未將此答案標記爲已接受。 – Javid
如果你只是想「快速終止」你的應用程序,你可以這樣做:TerminateProcess(GetCurrentProcess,1);這將立即解除您的申請,並以一聲嗚咽。當然,如果你的應用程序在這個時候做了重要的事情,事情可能會非常快速地橫向。 –
@艾倫:謝謝親愛的艾倫鮑爾,你的建議很有用。標記爲接受的答案。讓我解釋一下我之前評論的意思。當我將JITEnable設置爲2時,但是當我引發異常並且要求Windows關閉我的應用程序時,它不會執行它,並且它會一直持續到使用任務管理器終止進程。 – Javid
相反的異常處理解決方法路徑 - 你可以不使用任何:
function Crash(Arg: Integer): Integer; stdcall;
begin
Result := PInteger(nil)^;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TID: Cardinal;
begin
CloseHandle(CreateThread(nil, 0, @Crash, nil, 0, TID));
end;
Crash
執行一個新的線程。此線程沒有ANY異常處理程序。此類線程中的任何異常對於應用程序都是致命的。
我很好奇。爲什麼? –
@David:我只是想知道。像很多應用程序一樣,比如Photoshop等。 – Javid
這些應用程序不會故意以這種方式終止! –