我现在已经在Delphi中编写了几个服务,但是我希望从LAN unc路径或http服务器添加自动更新服务的功能。我一直在思考这个问题,我很想听听人们的想法。我可以创建一个定期检查更新的线程,但是如何自动停止服务卸载和安装。我最初的想法是在哪里编写一个控制台应用程序来执行此操作并使用create process启动它,然后让服务停止并且控制台应用程序完成工作,在服务退出之前启动新版本的服务。这是一个很好的策略还是我应该考虑的其他事情。提前致谢
答案 0 :(得分:1)
我希望该服务是一个只更新真实代码所在的另一个可执行文件或DLL文件的shell。
在shell和子进程之间建立一些通信方法来强制关闭,然后让shell执行升级并重新启动子进程。
作为旁注,这使得调试服务变得更加容易,并且您将能够直接运行子进程,而无需担心调试Windows服务所需的额外工作。
答案 1 :(得分:1)
我按照你的建议做。线程偶尔会检查更新。如果存在,则下载并将其放入适当的位置。然后它验证它是否有益(不要让它被破坏!)。最后,线程然后启动另一个带参数的应用程序,告诉它该做什么,具体来说,服务名称,要替换的文件的位置以及要替换它的文件。然后服务就等了。
当updater应用程序启动时,会暂停片刻以确保服务全部稳定,然后使用服务控制API停止服务。然后它会监视它直到它消失。最后,它暂停了一点,以确保Windows真正完成了该文件。然后它开始重命名旧文件以将其移开(如果仍在使用中,它重试几次),然后将新文件复制到位。最后,它再次启动服务。然后更新程序退出。
这对我的服务以及独立的应用程序也非常可靠(对于更新程序应用程序,使用不同的参数来了解哪种模式)。如果你小心,你可以使用完全相同的系统更新更新程序,这很好看。
答案 2 :(得分:0)
你的想法对我来说似乎很好,但考虑到这一点: - 将模块(主核心)添加到将要卸载的服务,并在更新可用时加载更新的模块(* .dll文件) - 此时服务应将“任务”放入队列或其他内容... 此外,您还可以使用Pascal script或DWScript
等插件和/或脚本答案 3 :(得分:0)
Windows 的最新版本(我认为从 Windows 10 开始)不允许服务启动其他程序。因此,您将需要其他程序来运行更新。它可能是其他服务。
<块引用>Windows 服务无法启动其他应用程序,因为它们是 不在任何特定用户的上下文中运行。不同于常规 Windows 应用程序、服务现在在隔离会话中运行,并且 禁止与用户或桌面交互。