2010-12-09 73 views
1

我有一個被設計成Windows服務的C++ Windows應用程序。它會定期執行更新以查看是否有新版本。要執行更新程序,請使用_execv()。更新程序查找新版本,下載它們並停止Windows服務(記錄所有這些操作),替換文件並再次啓動服務。在CLI模式下(不進入服務模式)以這種方式正常工作。根據我的日誌文件,子進程啓動,但父進程(Windows服務)退出。使用_execv()調用子進程時退出Windows服務

它甚至「允許」在Windows服務中啓動子進程,並且爲什麼該服務會意外退出?我的日誌文件顯示沒有錯誤(我甚至監測了寫入日誌的段錯誤等)。

回答

1

爲什麼你使用_execv()而不是使用windows方式並使用CreateProcess()

我假設你已經對你的服務進行了一些調試,並且你沒有超過你在服務中調用_execv()的地步?

1

_execv替換現有的進程與一個新的運行您傳遞的文件作爲參數。在Unix下(和類似的)直接/本地處理。然而,Windows並不直接支持這一點 - 所以這是通過讓父進程退出並且安排一個子進程立即啓動來完成的。

不好意思,聽起來好像_execv正在做它設計的 - 但在這種情況下,這可能不是你真正想要的。您可以從服務產生一個進程,但您通常希望使用CreateProcessAsUser在指定的帳戶下創建它,而不是服務帳戶(其中有一組相當不同尋常的權限)。當服務管理器詢問您的更新程序調用ControlService,CreateService等時,服務進程將退出並重新啓動。

+0

我誤解了_execv()的工作方式。 CreateProcessAsUser()似乎是我尋找的東西,謝謝。 – asiouser 2010-12-10 08:56:35

相關問題