我怎么知道CreateProcess实际启动进程的时间?

时间:2011-02-15 03:09:34

标签: winapi createprocess waitforsingleobject

我遇到麻烦,归结为希望CreateProcess StartProcess。问题在于,在{strong>创建流程时,CreateProcess会返回true,但系统无法启动流程。例如,即使无法解析其中一个launchee的导入,CreateProcess也会成功。

根据我希望通过启动此流程我希望完成的内容,可能会有十几个建议。但是,我担心这些建议都不一定有用,因为我不希望通过推出这个过程来特别完成任何事情。

一个示例建议可能是针对流程句柄调用WaitForSingleObject,然后调用GetExitCodeProcess。但我不能等待这个过程退出,因为它可能永远存在。

另一个示例建议可能是调用WaitForInputIdle,如果我希望通过一个我可以合理期望发射器创建的窗口与发射器进行通信,这将很有效。但我不希望这样,我无法合理地期待这一点。据我所知,launchee是一个控制台进程和/或永远不会有消息队列。同样,我不能等待(以启发式的意图)来找出答案。

事实上,我不能对发射器做任何假设。

为了更好地了解我在这里的想法,让我们看一下问题的另一面。如果进程没有启动,我想要一个错误代码,告诉我如何建议用户。如果导入全部已解决且主线程意识到它将要跳转到CRT启动代码(或等效的),并且我得到的错误代码是ERROR_SUCCESS,那太好了!但我实际上对发射器不感兴趣,只是希望在发射器中提供良好的用户体验。

哦,还有一件事:我希望这很简单。我不想写一个调试器。 : - )

想法?

2 个答案:

答案 0 :(得分:1)

  

一个示例建议可能是针对进程句柄调用WaitForSingleObject,然后调用GetExitCodeProcess。但我不能等待这个过程退出,因为它可能永远存在。

为什么不在一段合理的时间内等待进程句柄。如果在发出句柄信号之前计时器到期,您可以假设该过程已启动并正在运行。如果首先发信号通知句柄,并且退出代码是好的,那么你可以假设它已成功运行并完成。

如果您还没有看到它,Raymond Chen's blog中提到了CreateProcess vs started问题。

老实说,如果你不愿意接受启发式(比如,“三秒后它没有以失败代码结束,因此我们认为一切都很好”)那么你将不得不写一个' debugger',我指的是检查已启动进程的内部结构。

答案 1 :(得分:0)

这个问题已经过了很长时间没有答案,我怀疑可以肯定答案是:“你做不到。”