18

.NET アプリでプロセスを実行しています。

                Process process = new Process(); 

....

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

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

問題は、実行可能ファイルが時々クラッシュすることですが、これは問題ありませんが、AppCrash ダイアログがポップアップし、[閉じる] をクリックするまでアプリが実行を続行できなくなります。

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

しかし、コードでこれを行う方法はありますか?

編集:

kmp は素晴らしい回答を投稿しましたが、ネイティブ アプリケーションで同じことを達成する方法をまだ探しています。

4

2 に答える 2

24

クラッシュ プロセスのコードを編集できる場合は、以下に示すようなコードを追加することができます (この記事では、プログラム クラッシュ ダイアログの無効化について説明しています) -この Windows API 関数に関する MSDN 情報については、SetErrorMode 関数を参照してください。 .

クラッシュしているアプリケーションのコードを変更できない場合は、より複雑になり、実行時にコードを挿入する必要があります (どの程度複雑になるかは、起動するプロセスがどのプロセスで記述されているかによって異なります - .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);
于 2012-08-24T05:53:29.313 に答える
4

このドキュメントによると、SetErrorMode値を子プロセスに継承できるはずです。SetErrorModeそのため、値を要求してからネイティブ アプリを実行するあらゆる種類のランチャー (またはメイン アプリ) が機能するはずです。実際、この継承はデフォルトで存在します。オフにするには、こちらのフラグを参照してください

于 2012-10-16T13:46:37.697 に答える