【发布时间】:2011-02-15 03:09:33
【问题描述】:
我遇到了麻烦,归结为希望 CreateProcess 是 StartProcess。问题是在某些情况下CreateProcess 在创建 进程时返回true 但系统无法启动 进程。例如,CreateProcess 将成功,即使启动者的其中一个导入无法解析。
根据我希望通过启动此流程实现的具体目标,可能有十几个建议。但是,恐怕这些建议都不会有用,因为我不希望通过启动这个过程来完成任何特别的事情。
一个示例建议可能是针对进程句柄调用WaitForSingleObject,然后调用GetExitCodeProcess。但我不能等待进程退出,因为它可能会永远存在。
另一个示例建议可能是调用WaitForInputIdle,如果我希望通过我可以合理地期望启动者创建的窗口与启动者进行通信,这将很有效。但我不希望这样,我也不能合理地期望那样。据我所知,启动者是一个控制台进程和/或永远不会有消息队列。同样,我不能等待(带着启发式意图)找出答案。
事实上,我不能假设任何关于启动者的事情。
为了更好地了解我在这里的想法,让我们看看问题的另一面。如果该过程没有启动,我需要一个错误代码来告诉我如何建议用户。如果导入全部解决并且主线程意识到它即将跳转到 CRT 启动代码(或等效代码),我得到的错误代码是 ERROR_SUCCESS,太好了!但我实际上对启动器不感兴趣,只是希望在启动器中提供良好的用户体验。
哦,还有一件事:我希望这很简单。我不想写调试器。 :-)
想法?
【问题讨论】:
-
不管怎样,使用 DEBUG_PROCESS 启动非常简单,但可能会产生您不想要的副作用。
-
如果您想在您启动的进程无法解析其所有导入时进行捕获,您是否还想在它抛出异常并且没有捕获它时进行捕获?当它决定运行到无效内存和段错误时怎么办?或者如果它因为命令行参数错误而决定终止?从用户体验的角度来看,所有这些“它不起作用”的情况都与非技术人员非常相似。
-
是的,所以我想我应该澄清一下我确实想假设一件事:该过程负责报告自己的失败。
-
当找不到它要使用的DLL时,它不应该负责报告吗?
-
当然可以这样说,但是由于导入解析发生在主线程进入 CRT 之前,并且由于大多数代码,尤其是移植代码是在不知道需要导入哪些符号以及需要导入哪些符号的情况下编写的链接器将负责,我希望能够在启动器中报告这些故障。基本上,大多数程序都认为宇宙是从 main 开始的,我想宠爱它们。
标签: winapi createprocess waitforsingleobject