我有一个使用Delphi 2010构建的Windows服务,我正在使用Inno Setup安装程序进行部署。
它主要是顺利运行 - 我在卸载和升级之前正确停止了服务,并在安装后重新启动它。
[Run]
Filename: {app}\MyService.exe; Parameters: "/INSTALL /SILENT"; ...
[UninstallRun]
Filename: {app}\MyService.exe; Parameters: "/UNINSTALL /SILENT"; ...`
但是,我还有一个问题:如果我连续两次运行安装程序,那么下次卸载时无法显示消息对话框:Service XXX failed to uninstall with error: "System Error. Code:1060. The specified service does no exist."
日志记录显示卸载程序运行时“UninstallRun”部分正在执行两次。第二次,它失败并抛出错误消息(来自TServiceApplication::RegisterServices
),因为该服务已经被卸载。很确定这是因为Inno Setup在uninstall.dat
跟踪多个安装的方式。
我解决这个问题的'hack'是使用TService的ServiceBeforeUninstall
处理程序,如果没有安装服务,则使用exit(0)
。这感觉就像一种蛮力的方法 - 有更聪明的方法来解决问题吗?
答案 0 :(得分:1)
不要在TService中使用内置的SCM包装器函数,使用SCM API,它们将为您提供更多的服务管理控制。我多年前写了一个InnoSetup脚本,你可以找到它here - 有一段时间我没有更新它,但它仍然是一个起点。