c++ - 包含 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=""[INSTALLDIR]ACService.exe" /install /silent">
</CustomAction>
<CustomAction
Id="LaunchApp_SrvUninstall"
Directory="INSTALLDIR"
Impersonate="no"
Execute="deferred"
ExeCommand=""[INSTALLDIR]ACService.exe" /uninstall /silent">
</CustomAction>
<InstallExecuteSequence>
<Custom Action="LaunchApp_SrvInstall" After="InstallFiles">NOT REMOVE</Custom>
<Custom Action="LaunchApp_SrvUninstall" Before="RemoveFiles">REMOVE ~= "ALL"</Custom>
</InstallExecuteSequence>
使用上面的语法,在包安装期间,将文件复制到安装目录后,我已注册服务,如果我正在卸载包,则在删除已安装文件之前取消注册服务。在这两种情况下,它都能完美运行。当我尝试将软件更新到较新版本时,我面临的问题发生了,我遇到了软件和服务正在运行并且用户尝试安装新的 MSI 包以更新整个解决方案的情况。在这种情况下,我有以下弹出窗口:
似乎在更新过程中,安装程序试图注册服务两次,但我不知道为什么。这里有没有人已经遇到过这种情况?有没有办法配置自定义操作在包更新期间也可以工作?
解决方案
推荐阅读
- powerbi - 根据可用的最大日期返回文本值
- graphviz - 如何使用 twopi 划分大图
- linux - systemd 未从 ExecStart 启动服务
- javascript - 检查UDP套接字是否在某个端口上运行,关闭它,然后再次运行
- python - 如何将 CSV 文件拆分为两个具有重叠行的文件?
- c# - 如何创建一种方法来对不同客户类型的一维数组进行排序?
- c# - 每个 FlowListView 单元格的不同图像
- c - 访问数组中存储的元素时的奇怪结果
- nodes - XQuery:如何获取具有包含在序列中的属性的子节点的所有节点
- android - 如何防止或阻止android应用程序中的许多请求