首页 > 解决方案 > 包含 C++ Builder Windows 服务的 Wix 安装程序包

问题描述

我有一个使用 Wix 工具集制作的安装包,其中包括使用 Embarcadero 的 C++ Builder 创建的服务。如果与 Visual Studio C++/C# 相比,ECB 在 Windows 下注册/注销服务的语法不同,我无法通过常规 Wix 元素注册服务<ServiceInstall>,安装程序在服务注册/注销期间冻结。我通过 Wix 找到了解决方案Custom Actions。我创建了以下操作:

    <CustomAction
        Id="LaunchApp_SrvInstall"
        Directory="INSTALLDIR"
        Impersonate="no"
        Execute="deferred"
        ExeCommand="&quot;[INSTALLDIR]ACService.exe&quot; /install /silent">
    </CustomAction>
    <CustomAction
        Id="LaunchApp_SrvUninstall"
        Directory="INSTALLDIR"
        Impersonate="no"
        Execute="deferred"
        ExeCommand="&quot;[INSTALLDIR]ACService.exe&quot; /uninstall /silent">
    </CustomAction>

    <InstallExecuteSequence>
        <Custom Action="LaunchApp_SrvInstall"   After="InstallFiles">NOT REMOVE</Custom>
        <Custom Action="LaunchApp_SrvUninstall" Before="RemoveFiles">REMOVE ~= "ALL"</Custom>
    </InstallExecuteSequence>

使用上面的语法,在包安装期间,将文件复制到安装目录后,我已注册服务,如果我正在卸载包,则在删除已安装文件之前取消注册服务。在这两种情况下,它都能完美运行。当我尝试将软件更新到较新版本时,我面临的问题发生了,我遇到了软件和服务正在运行并且用户尝试安装新的 MSI 包以更新整个解决方案的情况。在这种情况下,我有以下弹出窗口:

在此处输入图像描述

似乎在更新过程中,安装程序试图注册服务两次,但我不知道为什么。这里有没有人已经遇到过这种情况?有没有办法配置自定义操作在包更新期间也可以工作?

标签: c++servicewixwindows-installerupdates

解决方案


在评论中给出了有用的提示之后,当我将 Embarcadero IDE 的属性 Name 和 DisplayName 与 WiX 安装程序项目源的标签NameDisplayName相关联时,一切正常,此外必要<ServiceInstall>

在此处输入图像描述 在此处输入图像描述

而已。现在我可以使用 WiX 处理我的服务。我很有信心上面的细节也适用于 Delphi 编译器。


推荐阅读