2012-08-24 46 views
15

我在.NET應用程序中執行Process。以編程方式禁用Windows錯誤報告(AppCrash)對話框

   Process process = new Process(); 

.... 

       process.StartInfo.UseShellExecute = false; 
       process.StartInfo.ErrorDialog = false; 

       process.StartInfo.CreateNoWindow = true; 
       process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
.... 
       process.Start(); 

的問題是,可執行文件有時會崩潰,這是確定的,但dialg彈出,防止應用程序的APPCRASH繼續執行,直到我點擊關閉。

我知道我可以設置HKLM\Software\Microsoft\Windows\Windows Error Reporting\值禁用,以真 - msdn.microsoft.com/en-us/library/bb513638%28v=vs.85%29.aspx

但是有沒有一種方式,我可以在代碼中做到這一點?

編輯:

KMP發佈了一個偉大的答案,但我仍然在尋找如何實現與本地應用程序一樣。

回答

19

如果您可以編輯崩潰過程的代碼,那麼您可以添加如下所示的代碼(本文將對此進行討論:Disabling the program crash dialog) - 有關此Windows API函數的MSDN信息,請參閱SetErrorMode function

如果你不能改變崩潰的應用程序的代碼,它會更復雜,你將不得不在運行時注入代碼(這是多麼複雜,取決於你正在啓動的進程是寫在哪裏 - 如果它是一個.NET例如,處理它比本地應用程序更容易,所以您需要提供關於該處理的更多信息)。

[Flags] 
internal enum ErrorModes : uint 
{ 
    SYSTEM_DEFAULT = 0x0, 
    SEM_FAILCRITICALERRORS = 0x0001, 
    SEM_NOALIGNMENTFAULTEXCEPT = 0x0004, 
    SEM_NOGPFAULTERRORBOX = 0x0002, 
    SEM_NOOPENFILEERRORBOX = 0x8000 
} 

internal static class NativeMethods 
{ 
    [DllImport("kernel32.dll")] 
    internal static extern ErrorModes SetErrorMode(ErrorModes mode); 
} 

// Ideally the first line of the main function... 

NativeMethods.SetErrorMode(NativeMethods.SetErrorMode(0) | 
          ErrorModes.SEM_NOGPFAULTERRORBOX | 
          ErrorModes.SEM_FAILCRITICALERRORS | 
          ErrorModes.SEM_NOOPENFILEERRORBOX); 
+0

謝謝,但我不能改變崩潰的過程。可執行文件是本地代碼。該應用程序是gswin64c.exe可以在這個存檔中找到:http://downloads.ghostscript.com/public/gs906w64.exe – user1615362

+0

因此,任何想法如何可以注入本機應用程序? – user1615362

+0

工程很棒。在處理託管應用程序時可能不需要注入。你可以創建一個包裝器應用程序,它將設置這些標誌,然後加載真正的應用程序集(而不是新進程)並使用反射來執行Program.Main(),但這只是一個想法,我還沒有測試過。 – Ondra

4

根據this document應該可以繼承SetErrorMode值的子進程。因此,任何類型的發射器(或您的主應用程序)將SetErrorMode所需的值,然後執行您的本機應用程序應該工作。實際上,這個繼承是默認存在的。要關閉它,請參閱flags here

相關問題