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 对话框并阻止应用程序继续执行,直到我单击关闭。

我知道我可以将HKLM\Software\Microsoft\Windows\Windows Error Reporting\值 Disabled 设置为 true - 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

According to this document it should be possible to inherit the SetErrorMode value to the child process. So any kind of launcher (or your main app) that would SetErrorMode to required values and then execute your native app should work. Actually this inheritace exists by default. To turn it off see flags here.

于 2012-10-16T13:46:37.697 回答