【问题标题】:GetExitCodeProcess() return 1 when process is not yet finishedGetExitCodeProcess() 在进程尚未完成时返回 1
【发布时间】:2012-07-30 16:48:05
【问题描述】:

如果我为它创建一个进程和两个管道集,并且该进程在某个时间需要一些用户输入,则来自 Windows C API 的GetExitCodeProcess() 总是返回1。例如,您可以使用 Windows time 命令,这将返回:

The current time is: ...
Enter the new time:

然后不等待输入立即退出。

我不希望这个过程在它真正完成之前完成,这样我就可以通过管道输入它。我该如何解决这个问题。

我已经建立了这个循环(我仍然希望能够确定处理何时完成):

for (;;)
{
    /* Pipe input and output */
    if (GetExitCodeProcess(...) != STILL_ACTIVE) break;
}

提前致谢。

【问题讨论】:

  • 如果您想知道进程何时完成,请不要使用 GetExitCodeProcess - 考虑如果进程退出代码为 STILL_ACTIVE 会发生什么!相反,请使用 WaitForSingleObject。一旦进程退出,进程句柄将发出信号。
  • 是的,但是 WaitForSingleObject 会锁定您当前的线程。微软还建议不要使用 STILL_ACTIVE 作为退出代码 (259)。
  • 如果您期待窗口消息,请使用 MsgWaitForMultipleObjects 而不是 WaitForSingleObject。但是,如果您确实需要轮询,则可以使用超时为零的 WaitForSingleObject。这会测试对象的状态并立即返回。 Microsoft 可能会建议不要使用 STILL_ACTIVE 的退出代码,但很少有程序员对此采取任何预防措施。既然以正确的方式做事同样容易,为什么要冒险呢?
  • 你说得对,我会改的。感谢您的有用评论!

标签: c windows api


【解决方案1】:

GetExitCodeProcess返回 STILL_ACTIVE; STILL_ACTIVE 是通过lpExitCode out 参数返回的退出代码。您需要测试返回的退出代码:

DWORD exitCode = 0;
if (GetExitCodeProcess(handle, &exitCode) == FALSE)
{
    // Handle GetExitCodeProcess failure
}

if (exitCode != STILL_ACTIVE)
{
    break;
}

【讨论】:

  • @HansPassant:同意!答案已修改。 (我浏览了声明,只是在退货文档中阅读了“返回非零”...)
  • 当然。真傻我。这个错误存在了很长时间,但我只是在尝试将输入管道输入到程序时才注意到它。非常感谢。
  • 对我不起作用,即使进程在等待消息框并且返回值为1,进程的退出码也是0。
  • @JamesMcNellis,我测试了你的代码,当进程仍在运行时,我得到 ExitCode = 0。
猜你喜欢
  • 2015-03-04
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多