1

我有一个设计为 Windows 服务的 C++ Windows 应用程序。它定期执行更新程序以查看是否有新版本。要执行更新程序,_execv()使用。更新程序查找新版本,下载它们并停止 Windows 服务(所有这些操作都会记录下来),替换文件,然后再次启动服务。在 CLI 模式下(不进入服务模式)这样做可以正常工作。根据我的日志文件,子进程已启动,但父进程(Windows 服务)退出。

甚至“允许”在 Windows 服务中启动子进程,为什么服务会意外退出?我的日志文件没有显示错误(我什至正在监视写入日志的段错误等)。

4

2 回答 2

1

你为什么要使用_execv()而不是使用 windows 方式和 using CreateProcess()

我假设您已经在您的服务中进行了一些调试,并且您没有超过您调用_execv()服务的点?

于 2010-12-09T16:04:04.643 回答
1

_execv 将现有进程替换为运行您作为参数传递的文件的新进程。在直接/本机处理的Unix(和类似的)下。然而,Windows 并不直接支持这一点——所以它是通过让父进程退出并安排子进程尽快启动来完成的。

IOW,听起来就像_execv是在做它的设计——但在这种情况下,它可能不是你真正想要的。您可以从服务中生成进程,但您通常希望CreateProcessAsUser在指定帐户而不是服务帐户下创建它(该帐户分配了一组相当不寻常的权限)。ControlService然后,当您的更新程序调用,CreateService等时,服务管理器要求服务进程退出并重新启动。

于 2010-12-09T16:06:43.580 回答