我可以在C#进程中使用SetErrorMode吗?

我可以在C#进程中使用SetErrorMode吗?,c#,winapi,C#,Winapi,我正在准备写一个在线评委核心, 一个程序,可以编译用户的代码并运行该程序来检查答案,就像一个在线判断 我在捕捉下面的提交程序异常时遇到了问题 int main() { while(~scanf("%d %d",n,&m)) { printf("%d\n",n+m); } return 0; } 它在第一行被拒绝访问,因为它将整数扫描到错误位置。 如何捕获进程的运行时错误 我曾经使用“try-catch”捕捉异常, 但它没有回答任何关

我正在准备写一个在线评委核心,
一个程序,可以编译用户的代码并运行该程序来检查答案,就像一个在线判断

我在捕捉下面的提交程序异常时遇到了问题

int main()
{
    while(~scanf("%d %d",n,&m))
    {   
        printf("%d\n",n+m);
    }
    return 0;
}
它在第一行被拒绝访问,因为它将整数扫描到错误位置。
如何捕获进程的运行时错误

我曾经使用“try-catch”捕捉异常,
但它没有回答任何关于运行时错误的问题

因此,我只检查提交程序的退出代码,尽管这不是一个好的检查方法,除了一个过程。
它显示出

我必须手动关闭错误消息框,
我找到了一个解决方案,就是在这个过程中使用SEH处理程序DLL

SetErrorMode(SEM_NOGPFAULTERRORBOX);
但我不知道如何在C#process中使用它

下面是我的法官守则

timer = new Stopwatch();
timer.Reset();

submitProg = new Process();
submitProg.StartInfo.FileName = outputFile;
submitProg.StartInfo.UseShellExecute = false;
submitProg.StartInfo.CreateNoWindow = true;
submitProg.StartInfo.RedirectStandardInput = true;
submitProg.StartInfo.RedirectStandardOutput = true;
submitProg.StartInfo.RedirectStandardError = true;
submitProg.StartInfo.ErrorDialog = false;
submitProg.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
submitProg.EnableRaisingEvents = true;

submitProg.Start();
timer.Start();

progInput = submitProg.StandardInput;
progOutput = submitProg.StandardOutput;

progInput.Write(inputStream.ReadToEnd());
submitProg.StandardInput.Close();
while (!submitProg.HasExited)
{
    peakPagedMem = submitProg.PeakPagedMemorySize64;
    peakVirtualMem = submitProg.PeakVirtualMemorySize64;
    peakWorkingSet = submitProg.PeakWorkingSet64;
    if (peakPagedMem > memLimit)
    {
        submitProg.Kill();
    }
    if (timer.ElapsedMilliseconds > timeLimit)
    {
        timeLimitExceed = true;
        submitProg.Kill();
    }
}

timeUsed = timer.ElapsedMilliseconds;
timer.Stop();

if(submitProg.ExitCode!=0)systemRuntimeError = true;
谢谢你的帮助,很抱歉我的英语不好

=====================<br> p、 s.
问题是如何在C#中为子进程设置错误模式。

我的英语不够好,无法解释这个问题,很抱歉。

如果您指的是Win32 API函数,那么您需要使用一个简单的签名:

[DllImport("kernel32.dll")]
static extern ErrorModes  SetErrorMode(ErrorModes uMode);

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

(站点始终是获得正确声明的好地方。)

如果不向另一个进程中注入代码,则无法在该进程中设置错误模式。这在C#中是不容易做到的。它在C/C++中也不能很好地工作,这类程序的寿命不够长,无法给您注入时间

无论如何,这并不能解决您的问题,您还必须防止程序陷入无休止的循环后永远不会退出。简单的解决方案是给每个程序有限的执行时间。比如说10秒。如果它没有完成,则Process.Kill()将其删除并声明失败。这也将处理那些用消息框轰炸的程序


使用流程实现很简单。WaitForExit(毫秒)重载。

有几个错误框应该不是问题,因为在任何情况下,您都需要很好地对您的东西进行沙箱处理。您可以用它杀死沙盒和进程。@kannaduki MSDN上没有提到这是由子进程继承的——因此我认为它不是继承的,似乎不是继承的。如何为我的子进程设置错误模式?谢谢。@kannaduki正在进行中。我注意到MSDN建议在Win7/2008R2中使用
SetThreadErrorMode
,这是一个新的API,因为它“破坏性更小”。也就是说,只有在exe及其使用的库在编写和测试时考虑了不同的错误模式,这样更改全局状态才是安全的。来自MSDN: