我有一个程序需要调用进程来执行操作并等待它完成操作。问题是被调用的进程克隆自己并退出,这导致等待api在进程退出时返回。我如何等待克隆进程完成执行并返回?
我正在使用http://www.microsoft.com/msj/0399/jobkernelobj/jobkernelobj.aspx中提到的Windows JOB对象,但我不确定这是否是最好的方法。
答案 0 :(得分:1)
或者(我的意思是,那非常黑客)儿童过程在做什么?是否有其他方法可以检测到它何时完成它的目的?
获取进程父ID的黑客方法
http://www.codeguru.com/cpp/w-p/win32/article.php/c1437
获取句柄,并使用上面代码中的方法返回父ID。
http://msdn.microsoft.com/en-us/library/ms684280(VS.85).aspx
OpenProcess获取一个id,获取一个句柄(如果你很幸运)
http://msdn.microsoft.com/en-us/library/ms684320(VS.85).aspx
GetProcessId获取句柄,获取它的id。
http://msdn.microsoft.com/en-us/library/ms683215(VS.85).aspx
GetExitCodeProcess接受句柄,返回进程是否完成。
http://msdn.microsoft.com/en-us/library/ms683189(VS.85).aspx
所以appart使用隐藏的nt调用它明确地告诉你不要,你基本上必须创建你的进程,得到它的id,然后垃圾邮件的所有进程,打开它们并检查他们的父id与进程的id你创建了,如果你没有找到,那么就完成了,如果你这样做了,用GetExitCodeProcess将其垃圾邮件直到它完成。
我没有测试任何这个,但它看起来像是一种方法。虽然如果这是最好的方式,我可能只需要放弃对窗户的所有信任......
答案 1 :(得分:0)
如果你可以控制被调用进程的来源,一种可能的解决方案就是让它等待它通过克隆自己产生的进程。
答案 2 :(得分:0)
+1使用作业对象;)
假设你正在运行的进程没有以这样的方式产生克隆版本的自身,那么它就会突然失去工作......
您应该能够简单地监控工作事件并对JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO
采取行动(请参阅JOBOBJECT_ASSOCIATE_COMPLETION_PORT和SetInformationJobObject())。以这种方式监视作业还将为您提供有关在作业中创建的新进程的processId的通知以及退出时的详细信息。