2012-11-12 99 views
1

在MFC中,我使用這個代碼如何終止程序開始的ShellExecute

ShellExecute(NULL, _T("open"), _T(EXTERNAL_APP), params, 
      _T(EXTERNAL_PATH), SW_HIDE); 

要啓動的程序在後臺運行外部程序。

但是,當我的應用程序終止時,此程序仍在運行,可通過檢查Windows任務管理器窗格進行驗證。

所以我的問題是,當我的應用程序停止時,如何讓外部程序停止

+0

外部應用程序是否是您控制的應用程序,即您有權訪問其源代碼的應用程序?如果是這樣,我會建議在外部應用程序需要退出時,在兩個應用程序之間共享一個事件(在命令行中傳遞隨機名稱),該事件會發出信號。這是確保外部應用程序可以乾淨關閉的唯一干淨方式。 –

+0

這在技術上可以通過在Windows中使用Job對象來完成。然而,無論如何在Vista中搞砸了,資源管理器本身就開始把流程放在工作中。最簡單的方法是通過命令行將PID傳遞給啓動的進程,並在進程句柄得到信號時終止。或者自己殺掉它,但那沒有保證。 –

+0

不,我沒有訪問外部應用程序的來源... – Wartin

回答

1

嘗試ShellExecuteEx而不是,它可以返回新啓動的進程的HANDLE hProcess

當/如果你有一個HANDLE hProcess那麼我希望你可以將它作爲參數傳遞給TerminateProcess函數:在應用程序停止之前你將調用(終止子進程)。

+2

雖然這會起作用,但終止另一個流程(即使是您啓動的流程)可能會導致*危險*,從而無法對當時正在執行的流程進行特別的瞭解。例如,考慮一下如果進程處於將配置文件寫入磁盤的過程中,TerminateProcess將會產生的效果。 –