c - 我如何知道我是否从 GetExitCodeProcess 获得了实际的退出代码?

标签 c windows winapi exit-code

我正在制作一个程序来检查现有进程并返回其退出代码...如果它是一个退出代码。如果程序出错,它会返回 -1。

我的代码现在看起来像:

HANDLE hProcess = OpenProcess( SYNCHRONIZE | PROCESS_QUERY_INFORMATION, FALSE, pid );
if(!hProcess) {
    switch (GetLastError()) {
       //Handle errors and such
    }
} else {
    WaitForSingleObject(hProcess, INFINITE);
    int exit_code;
    GetExitCodeProcess(hProcess, &exit_code);
    return exit_code;
}

但是,作为 documentation说,GetExitCodeProcess 可以返回退出代码或异常值。我不想要异常值!如果过程出错,我想返回 -1!

有什么方法可以区分吗?有没有一种简单的方法可以判断进程崩溃了?

最佳答案

我不认为你可以从进程外部分辨出来,除非你调试它。

忽略线程,概念上你可以这样想:

MainThread(EXE*exe)
{
  __try
  {
    NTDLL_LoadDlls(exe);
    int retval = exe->WinMain();
    ExitThread(retval); // Exits the process if there is only one thread
  }
  __catch(...)
  {
    int exceptcode = getexceptioncode();
    WER_ReportCrash(exe, exceptcode);
    TerminateProcess(GetCurrentProcess(), exceptcode);
  }
}

0 通常表示成功,1 表示一般性失败,其他任何情况都可能是问题。低代码 (<=255) 可能有意义,但它们是特定于程序的。 >= 0xC0000000 可能是崩溃。

关于c - 我如何知道我是否从 GetExitCodeProcess 获得了实际的退出代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57166997/

相关文章:

c - C99:fscanf()设置eof早于fgetc()的标准做法吗?

c - C 中的 GMP 库 - 如何使添加更精确?

windows - ggplot 字体系列在版本之间发生变化

java - GUI多窗口

c++ - 我需要在 VariantChangeType 之后调用 VariantClear

windows - native Windows 应用程序开发选项

c++ - 用于有序组合生成和排名的库?

c++ - 通过 FS 寄存器访问衍生进程的 TIB?

regex - 删除文件每行末尾的制表符

c++ - 强制 WSARecv 重叠