2011-03-03 78 views
3

你可能會認爲這是一個愚蠢的問題,但我很好奇如何終止我的delphi製作的應用程序與APPCRASH錯誤。 (也被稱爲「不發送」錯誤!)如何在Delphi應用程序中調用APPCRASH事件?

日Thnx提前

+0

我很好奇。爲什麼? –

+0

@David:我只是想知道。像很多應用程序一樣,比如Photoshop等。 – Javid

+2

這些應用程序不會故意以這種方式終止! –

回答

11

你可以通過設置全局變量,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. 
+0

它的工作原理,但它只有一個問題。應用程序阻塞,當我們想關閉它時,我們不能(除了使用任務管理器)。儘管它看起來像標準答案,但我並未將此答案標記爲已接受。 – Javid

+2

如果你只是想「快速終止」你的應用程序,你可以這樣做:TerminateProcess(GetCurrentProcess,1);這將立即解除您的申請,並以一聲嗚咽。當然,如果你的應用程序在這個時候做了重要的事情,事情可能會非常快速地橫向。 –

+0

@艾倫:謝謝親愛的艾倫鮑爾,你的建議很有用。標記爲接受的答案。讓我解釋一下我之前評論的意思。當我將JITEnable設置爲2時,但是當我引發異常並且要求Windows關閉我的應用程序時,它不會執行它,並且它會一直持續到使用任務管理器終止進程。 – Javid

3

相反的異常處理解決方法路徑 - 你可以不使用任何:

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異常處理程序。此類線程中的任何異常對於應用程序都是致命的。

+1

-1這並不回答實際的問題,即如何觸發使用操作系統功能處理異常的特定方式。艾倫的答案確實如此;你的作品展示了處理線程和代碼中的異常的絕對錯誤方式。 –

+0

你在開玩笑嗎? – Alex

+1

不錯的解決方案亞歷山大。它按預期工作;) – Javid

相關問題