2012-08-24 51 views
15

.NETアプリケーションでプロセスを実行しています。プログラムで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(); 

問題がOKである、実行ファイルが時々クラッシュするということですが、APPCRASHのdialgがポップアップし、私は近くをクリックするまで実行を継続するためにアプリを防ぎます。

私がtrueに無効HKLM\Software\Microsoft\Windows\Windows Error Reporting\値に設定できることを知っている - msdn.microsoft.com/en-us/library/bb513638%28v=vs.85%29.aspx

をしかし、その方法があります私はコードでこれを行うことができますか?

EDIT:

KMPは偉大な答えを掲載しているが、私はまだネイティブアプリケーションと同じことを達成するための方法を探しています。

答えて

19

クラッシュプロセスのコードを編集できるのであれば、このWindows API関数に関するMSDN情報についてはSetErrorMode functionを参照してください(この記事では、この記事で説明しています):Disabling the program crash dialog

クラッシュするアプリケーションのコードを変更できない場合は、実行時にコードが複雑になります(起動するプロセスの種類によって複雑になります - .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となるネイティブアプリを実行する任意の種類のランチャー(またはメインアプリ)が動作するはずです。実際には、この継承はデフォルトで存在します。オフにするには、フラグhereを参照してください。

関連する問題