1

我的 wxs 文件中的片段:

<ServiceInstall Id="ServiceInstall" Type="ownProcess" Vital="yes"
    Name="service name"
    DisplayName="service display name"
    Description="service description"
    Start="auto" Account="[SERVICEUSERNAME]" Password="[SERVICEPASSWORD]"
    ErrorControl="normal" Interactive="no" />

<ServiceControl Id="StartService"
    Start="install" Stop="uninstall" Remove="uninstall"
    Name="service name" Wait="yes">
    <ServiceArgument>arguments for first run</ServiceArgument>
</ServiceControl>

如果服务启动失败,安装程序会在失败前等待几分钟,而它应该能够检测到它处于停止状态,并且从那时起,如果没有手动干预,就永远无法达到启动状态。然而,它一直在等待。有没有什么办法解决这一问题?

4

1 回答 1

0

服务控制是一种基于消息的方案。Windows Installer 和服务控制机制等待服务响应启动消息。不清楚您所说的“检测它处于停止状态”是什么意思,因为代码可能正在执行合法工作,可能已经崩溃但具有恢复代码,或者可能配置为在失败后重新启动(请参阅 ChangeServiceConfig2 Win32 API)。

在您的情况下,您有 wait=yes ,它明确导致安装程序等待服务完全初始化。正如 MSDN 文档所说:

“将此字段保留为空或输入值 1 会导致安装程序在继续之前等待最多 30 秒以使服务完成。等待可用于为关键事件留出额外时间以返回失败错误。值此字段中的 0 表示仅等待服务控制管理器 (SCM) 报告此服务处于挂起状态,然后再继续安装。”

因此,更改您的等待值可能会有所帮助。无论如何,编码良好的服务正常启动的正常情况不会导致任何这些问题。服务被破坏的事实不仅是罕见的情况(或应该是),而且当事情被破坏时,它们实际上已经被破坏并且通常因此而无法预测。

于 2016-11-15T18:26:20.227 回答