如何在CPP中使用“GetExitCodeProcess”,“CreateProcess”和“WaitForSingleObject”功能?

时间:2017-01-04 12:19:39

标签: c++

我在“Windows.h”lib中看到了这三个连接函数,我想知道如何使用它们以及为什么要使用它们? 我试图在谷歌或MSDN文档中搜索信息,但我一无所获!

如果有人可以向我解释我应该如何(以及我为什么......)使用这三个连接的功能,这对我和其他1000个同样站在同一问题面前的人来说会很棒并将访问这里解决它。

那么,在一个简单的代码示例中,我应该如何使用每个函数?

1 个答案:

答案 0 :(得分:1)

问题可能过于宽泛,但由于the documentation涵盖了技术细节,读者可能会受益于更高层次的观点,包括C ++特定方面。

GetExitCodeProcess

GetExitCodeProcess 用于检查流程的退出代码。按照惯例,在Windows,Unix和C ++中,退出代码0(例如,从main返回)表示成功。在C ++中,此值可用作EXIT_SUCCESS的宏符号<stdlib.h>。在其他系统上EXIT_SUCCESS不需要为0,但在C ++中,退出代码0始终表示成功,可能除了EXIT_SUCCESS的值之外。

Windows和Unix-land约定是任何其他退出代码表示失败,但C ++中唯一的便携式失败值是由EXIT_FAILURE表示的值。在Windows中,这通常是值1.不幸的是,它与Windows错误代码的值相冲突,关于“不正确的函数”(由errlook.exe报告)。出于这个原因,人们可以选择使用Windows&#39;自己的一般失败值E_FAIL表示一般失败,而不是使用便携但不完美的EXIT_FAILURE

Windows和Unix-land之间的两个相关差异:

  • 在Windows中,非零退出代码通常是一个错误代码,可以告诉您有关失败原因的信息。它可以传递给Microsoft的工具 errlook 以获取文本说明,与通过API函数 FormatMessage 。在Unix-land进程中,用作失败原因的退出代码不太常见。

  • 在Unix-land工具中,通常可以依靠退出代码来指示失败或成功。在Windows中不是这样。甚至许多内置命令和标准命令都不能这样做。

特别是后一点对GetExitCodeProcess的使用很重要。您需要知道您正在检查的流程是一个产生有意义的退出代码的流程。

另请注意,代码 STILL_ACTIVE 被定义为较低的数字,因为我记得约270左右,并且可以由流程生成,因此它不是过程是否仍然有效的可靠指标。即,不要使用GetExitCodeProcess来轮询完成的过程。取决于过程和&amp;情况,这样的代码可能会挂起......

WaitForSingleObject

如上所述,可以通过使用GetExitCodeProcess轮询其退出代码(可能会挂起)来等待进程结束,而是使用例如 WaitForSingleObject 或家庭成员。

CreateProcess

CreateProcess 以前是创建新流程的基本方法,由ShellExecute等更高级别的功能在内部使用。

随着用户访问控制安全性(UAC)的出现,需要使用 ShellExecute (或家庭成员)来运行具有提升访问权限的流程。

如果要启动的进程是控制台子系统进程,使用C ++标准库的 system 函数通常会更方便,该函数使用{{ 1}}命令解释器运行指定的命令,等待结束,并返回进程退出代码。