Winapi 我如何知道CreateProcess何时实际启动了一个流程?

Winapi 我如何知道CreateProcess何时实际启动了一个流程?,winapi,createprocess,waitforsingleobject,Winapi,Createprocess,Waitforsingleobject,我遇到了麻烦,归结起来就是希望CreateProcesswereStartProcess。问题在于,在某些情况下,CreateProcess在创建进程时返回true,但系统无法启动进程。例如,CreateProcess即使无法解析launchee的导入之一,也会成功 可能有十几个建议可以提出,这取决于我到底希望通过启动这个过程来实现什么。然而,我担心这些建议都不会有用,因为我不希望通过启动这个过程来完成任何事情 一个示例建议是对进程句柄调用WaitForSingleObject,然后调用GetE

我遇到了麻烦,归结起来就是希望
CreateProcess
were
StartProcess
。问题在于,在某些情况下,
CreateProcess
在创建进程时返回true,但系统无法启动进程。例如,
CreateProcess
即使无法解析launchee的导入之一,也会成功

可能有十几个建议可以提出,这取决于我到底希望通过启动这个过程来实现什么。然而,我担心这些建议都不会有用,因为我不希望通过启动这个过程来完成任何事情

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

另一个示例建议可能是调用
WaitForInputIdle
,如果我希望通过一个我可以合理预期launchee创建的窗口与launchee进行通信,这将非常有效。但我不希望这样,我也不能合理地期望这样。据我所知,launchee是一个控制台进程,并且/或者永远不会有消息队列。同样,我也不能等待(带着启发性的意图)去发现

事实上,我不能对Launche做任何假设

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

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

想法

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

为什么不等待一段合理的时间来处理流程呢。如果计时器在句柄发出信号之前过期,则可以假定进程已启动并正在运行。如果首先通知句柄,并且退出代码良好,则可以假定它已成功运行并完成

如果您还没有看到,CreateProcess vs started问题在中提到过


老实说,如果你不愿意接受启发式(比如,“三秒钟后它没有以失败代码结束,因此我们假设一切正常”),那么你就必须编写一个“调试器”,我的意思是检查已启动流程的内部。

这个问题已经很久没有答案了,我怀疑可以得出这样的结论:答案是:“你不能。”

无论如何,使用调试流程启动非常简单,但可能会产生您不希望的副作用。如果您希望捕获正在启动的进程未能解析其所有导入时的情况,是否还希望捕获它抛出异常但未捕获异常时的情况?当它决定运行到无效内存和segfault时会怎么样?或者它决定终止是因为命令行参数错误?从用户体验的角度来看,所有那些“它不起作用”的情况都非常类似于非技术人员。没错,所以我想我应该澄清一下,我确实想假设一件事:进程负责报告自己的失败。那么,当它想要使用的DLL找不到时,它不应该负责报告吗?有人肯定会这么说,但由于导入解析发生在主线程进入CRT之前,由于大多数代码,尤其是移植的代码在编写时都没有意识到需要导入哪些符号以及链接器将处理哪些符号,因此我希望能够在启动器中报告这些失败。基本上,大多数程序都认为宇宙是从main开始的,我想宠爱它们。是的,启发式是我希望避免的。如果我必须的话,我会这么做——这比编写调试器不那么糟糕——但一个真正的解决方案会更好。你可以做一些类似于AppInit DLL的事情,它会报告启动的每个进程。但你的目标是什么?您认为流程成功的条件是什么?每个DLL都加载了吗?DLL可以在任何时候显式加载,应用程序可能会退出并出现错误,因此报告隐式DLL加载已完成实际上只是另一种启发式方法。我很高兴让动态加载的DLL失败。我所追求的只是确定应用程序的感知宇宙(从main的第一行开始,或者,如果是疯狂的话,从全局对象的第一个构造函数开始)是否已经存在。如果应用程序已经尝试过工作,那就足够了。如果以后由于任何原因失败了,那没关系。这是它自己的问题。直到现在我才知道AppInit DLL的存在。我仍在为他们绞尽脑汁。我的第一反应是避免做全球范围内的事情,但我会把这个想法在我的舌头上转一转。