Inno安装程序多次尝试卸载Delphi TService

Inno安装程序多次尝试卸载Delphi TService,delphi,service,inno-setup,Delphi,Service,Inno Setup,我有一个用Delphi2010构建的Windows服务,我正在使用Inno安装程序进行部署 它大部分工作都很顺利-我在卸载和升级之前正确地停止了服务,并在安装之后重新启动 [Run] Filename: {app}\MyService.exe; Parameters: "/INSTALL /SILENT"; ... [UninstallRun] Filename: {app}\MyService.exe; Parameters: "/UNINSTALL /SILENT"; ...` 但是,我

我有一个用Delphi2010构建的Windows服务,我正在使用Inno安装程序进行部署

它大部分工作都很顺利-我在卸载和升级之前正确地停止了服务,并在安装之后重新启动

[Run]
Filename: {app}\MyService.exe; Parameters: "/INSTALL /SILENT"; ...

[UninstallRun]
Filename: {app}\MyService.exe; Parameters: "/UNINSTALL /SILENT"; ...`
但是,我还有一个问题:如果我连续运行安装程序两次,那么下次卸载时将失败,并显示一个消息对话框:
Service XXX未能卸载,错误为:“系统错误。代码:1060。指定的服务不存在。”

日志记录显示,卸载程序运行时,“卸载运行”部分将执行两次。第二次,它失败并抛出错误消息(来自
TServiceApplication::RegisterServices
),因为该服务已卸载。这肯定是因为Inno安装程序在
uninstall.dat
中跟踪多个安装的方式


我的“黑客”修复方法是在卸载前使用TService的
服务
处理程序,如果未安装该服务,则使用
退出(0)
。这感觉像是一种蛮力方法-有没有更聪明的方法来解决问题?

不要在TService中使用内置的SCM包装函数,使用SCM API,它们将为您提供更多的服务管理控制。几年前我编写了一个iNoStUP脚本,你可以找到它——这是我不更新它的一段时间,但它仍然是一个起点。

我同意Inno不应该多次触发卸载逻辑,但是我也会认为这是TService < /代码>中的一个逻辑错误。显然,Borland(然后是CodeGear,然后是Embarcadero)在引发异常之前从未想过更新
UninstallService()
以忽略
ERROR\u SERVICE\u不存在。如果正在卸载服务且该服务不存在,则不应视为故障情况,预期结果已为真。BorCoDero多年来一直在更新
SvcMgr
单元,只进行了非常小的代码更改,以说明操作系统/编译器/RTL损坏,而不是修复逻辑错误,或者添加重复请求的新功能。哦,好吧。如果您想在几次安装后只运行一个unistall条目,请阅读InnoSetup文档中的
RunOnceId
。但是,它不会修复所有情况,因为用户/其他应用程序可以卸载该服务。因此,误用
Longword
是因为当时Inno安装程序中缺少类型?根据,DWORD是一个32位未签名的int。InnoSetup使用PascalScript,这不是最好的文档库。当然,我可以使用一些类型,但如果Delphi花了很长时间才发布64位版本,而AFAIK InnoSetup仍然是一个32位应用程序,这不是我的错。无论如何如果我在某个地方犯了一些错误,或者代码可以改进(而且可以),感受开源的美妙,修复它并发布代码。我总是喜欢所谓的“Delphi社区”如此渴望获得一些免费代码,更不用说编写和捐赠了。。。