2011-02-15 128 views
2

我遇到麻煩了,歸結爲CreateProcessStartProcess。麻煩的是,有CreateProcess返回true的情況,它在創建的過程中,但系統不能開始的過程。例如,即使其中一個導入者的導入無法解析,CreateProcess也會成功。如何知道CreateProcess何時實際啓動了一個進程?

根據我希望通過啓動這個過程完成的工作,我們可能會提出十幾個建議。但是,我擔心這些建議都不會有用,因爲我不希望通過啓動這個流程來完成任何事情。

一個示例建議可能是針對進程句柄調用WaitForSingleObject,然後針對進程句柄調用GetExitCodeProcess。但我不能等待這個過程退出,因爲它可能會一直存在。

另一個示例建議可能是致電WaitForInputIdle,如果我希望通過我可以合理預期發射窗創建的窗口與發射窗進行通信,那麼這將很有效。但我不希望這一點,也不能合理地期待這一點。據我所知,launchee是一個控制檯進程和/或永遠不會有消息隊列。同樣,我不能等待(以啓發式的意圖)來找出答案。

事實上,我不能假設任何有關這個推銷員。

爲了更好地瞭解我在這裏的想法,讓我們看看問題的另一面。如果這個過程沒有開始,我想要一個錯誤代碼告訴我如何建議用戶。如果導入全部解決,並且主線程意識到它即將跳入CRT啓動代碼(或等效),並且我得到的錯誤代碼是ERROR_SUCCESS,太棒了!但是我實際上並不熱衷於這個啓動程序,只是希望在啓動程序中提供良好的用戶體驗。

哦,還有一件事:我希望這很簡單。我不想寫一個調試器。 :-)

想法?

+0

對於它的價值,使用DEBUG_PROCESS啓動非常簡單,但可能會產生您不想要的副作用。 – tenfour 2011-02-15 03:14:02

+0

如果你想捕獲你正在啓動的進程無法解析其所有導入,你是否也想捕獲它何時拋出異常並且無法捕獲它?什麼時候它決定只是跑到無效的內存和段錯誤?或者如果它因爲命令行參數錯誤而決定終止?從用戶體驗的角度來看,所有這些「不起作用」的情況都非常類似於非技術人員。 – 2011-02-15 03:14:47

回答

0

這個問題已經過了很長時間沒有答案,我懷疑可以斷定答案是安全的:「你不行。」

1

一個示例建議可能是針對進程句柄調用WaitForSingleObject,然後調用GetExitCodeProcess。但我不能等待這個過程退出,因爲它可能會一直存在。

爲什麼你不等待進程句柄一段合理的時間。如果計時器在手柄發送信號之前到期,則可以推測該過程已啓動並正在運行。如果手柄首先發出信號,並且退出代碼良好,那麼您可以推測它已成功運行並完成。

如果您還沒有看到它,CreateProcess vs啓動問題在Raymond Chen's blog中提到。老實說,如果你不願意接受啓發式方法(比如「它在三秒後沒有以失敗代碼結束,因此我們假設一切都很好」),那麼你將不得不寫一個'調試器',我的意思是檢查啓動過程的內部。

相關問題