2013-05-13 699 views
5

我有两个二进制文件,必须为它们创建一个服务。我尝试了一个解决方案,使用“sc create”from How to install a Windows service with Inno Setup?Inno Setup:使用“sc create”安装Windows服务

但它没有为我工作。它在安装结束时陷入困境。我究竟做错了什么?

这里是我的代码:

Filename: {cmd}; Parameters: "sc create srvname start= auto DisplayName= mysrv binPath= {app}\mybinary.exe" ; Flags: runhidden 

我尝试使用cmd代替{cmd} - 没有变化。

我没有尝试我提到的解决方案中的Pascal代码。我把它作为最后的手段。

+1

可能的重复[如何安装Windows服务与Inno安装?](http://stackoverflow.com/questions/15204587/how-to-install-a-windows-service-with-inno -setup) – TLama 2013-05-13 08:54:40

+1

所以你的意思是告诉我必须使用你提到的解决方案中存在的pascal代码。 – rakesh 2013-05-13 09:32:06

+2

不是你必须的,只是你应该。 – TLama 2013-05-13 09:40:29

回答

15

我用这个代码和我的两个服务都安装和卸载:

[run] 
Filename: {sys}\sc.exe; Parameters: "create mysrv start= auto binPath= ""{app}\mysrv.exe""" ; Flags: runhidden 

[UninstallRun] 
Filename: {sys}\sc.exe; Parameters: "stop mysrv" ; Flags: runhidden 
Filename: {sys}\sc.exe; Parameters: "delete mysrv" ; Flags: runhidden 

这解决了我的问题,所以我为什么要在这种情况下使用帕斯卡尔?

+6

*为什么我应该在这种情况下使用Pascal?*因为如果脚本出现问题,您无法处理或作出反应?我知道你现在不在乎,但不久后你会。如果您告诉用户安装成功,并且他们运行的应用程序期望服务运行应用程序失败,您的用户可能会感到惊讶,因为服务将实际停止,但您不会注意到失败的尝试服务在安装程序中启动。 – TLama 2013-05-13 17:37:49

+1

这是一个很好的观点。我会记住这一点。谢谢 – rakesh 2013-05-14 09:25:11

8

是否有任何理由试图通过{cmd}运行它?

要么添加/C参数,并根据需要引用其余参数,或者仅使用所需参数运行sc.exe

[Run] 
Filename: "sc.exe"; Parameters: "create srvname start= auto DisplayName= mysrv binPath= {app}\mybinary.exe" ; Flags: runhidden 

注意,安装服务的正确方法是在this answer提到的API,可以让你检测和处理错误。

1

为什么不仅

[运行] 文件名:{SYS} \ SC.EXE;参数:/安装

+3

因为没有'/ install'参数。至少在不知道服务文件名的情况下,该工具将会丢失该做什么。 – TLama 2014-12-30 10:23:47

+1

这也重复了7个月前给出的答案。 – Deanna 2015-04-08 11:22:18