0

我在以前的一个版本中安装了两次服务组件。

<Component Id="MyServiceWin7" Guid="{GUID_WIN7}">
<File Id="mysvc_Win7"
      Name="mysvc.exe"
      Source=mysvc.exe"
      KeyPath = "yes"/>
<ServiceControl Id="MYSVC_Win7"
                Name="MYSVC"
                Remove="uninstall"
                Start="install"
                Stop="both"
                Wait="no" />
<ServiceInstall Id="My_Svc_Win7"
                Name="MYSVC"
                DisplayName="MYSVC"
                Type="ownProcess"
                Start="auto"
                ErrorControl="normal"
                LoadOrderGroup=""
                Description="My service">
</component>

<Component Id="MyServiceWin8" Guid="{GUID_WIN8}">
<File Id="mysvc_Win8"
      Name="mysvc.exe"
      Source=mysvc.exe"
      KeyPath = "yes"/>
<ServiceControl Id="MYSVC_Win8"
                Name="MYSVC"
                Remove="uninstall"
                Start="install"
                Stop="both"
                Wait="no" />
<ServiceInstall Id="My_Svc_Win8"
                Name="MYSVC"
                DisplayName="MYSVC"
                Type="ownProcess"
                Start="auto"
                ErrorControl="normal"
                LoadOrderGroup=""
                Description="My service">
</component>

所以会有两个 MYSVC 组件的实例。两者都映射到 MYSVC.exe。

我错过了上一版本中的操作系统版本条件检查。

它运行成功。

我正在考虑在下一次更新中删除虚拟的附加组件(GUID_Win7 或 GUID_WIN8)。

我如何删除它,我需要编写自定义操作吗?

任何帮助,将不胜感激。

编辑:: 请找到答案,

  1. mysvc 有一些第三方库依赖操作系统特定于 Win7 和 Win8,如果我们检查 sc qc mysvc 我创建了服务并且 mysvc.exe 映射到服务 binpath,它的工作意味着它安装成功

  2. 是的,这两个服务组件的目标相同,当我执行 sc 查询 mysvc 时只有一个组件

  3. 不,只有一项服务。mysvc.exe 是磁盘上的 win8 版本。

感谢您的建议,断开链接。

目前,我有 win 7 和 win8 的 %ProgramFiles%\MyApp\mysvc.exe 通用路径。所以我的问题是是否创建新的通用路径来打破先前的链接。ProgramFiles%\MyApp\mysvc\mysvc.exe [[NEW_GUID1]] for win7 ProgramFiles%\MyApp\mysvc\mysvc.exe [[NEW_GUID2]] for win8

带有 [[OLD_GUID1]] 、 [[OLD_GUID2]] 的组件将永远在系统上,直到我的产品被卸载,所以我们不能只删除带有 [[OLD_GUID1]]、[[OLD_GUID2]] 的组件来清理陈旧(非功能性)组件

谢谢

4

1 回答 1

1

一些问题

  • 首先,我们能问一下您为什么决定安装两种风格的服务吗?这是否意味着该服务具有不同的 Win7 和 Win8 二进制文件?如果是这样,那么不清楚你为什么说它按现状工作。
  • 这些服务组件是否针对两个不同的安装位置,以便它们都并行运行,或者您是否针对两个组件的相同目标位置?(所以安装后只有一个文件实例)。
  • 安装后盒子上的服务列表中是否有两个条目?如果您使用两个组件定位相同的位置,将哪个文件版本mysvc.exe放到磁盘上?(如果它们不同)。

在上述问题之前,我写了以下内容。请用问题的答案更新您的问题。以下可能无关紧要 - 我们需要更多信息。


过去的罪恶:如果您在以前的版本中使用两个不同的组件 GUID 安装了同一个文件两次,那么这是错误的,我建议您通过设置两个新的组件 GUID“断开链接”到过去的罪恶新版本和关键:为每个组件设置一个新的绝对安装位置(不要针对具有两个不同 GUID 的相同绝对键路径! - 条件与否)。

这个想法是分离旧版本和新版本,以便您从一个干净的(er)开始。

就像是:

Comp 1: {77777777-7777-7777-7777-777777777777}, [ProgramFilesFolder]My App\Win7\mysvc.exe

Comp 2: {42424242-4242-4242-4242-424242424242}, [ProgramFilesFolder]My App\Win8\mysvc.exe

就个人而言,我会避免使用 Windows 版本号,并且可能会使用其他东西。一年怎么样?

Comp 1: {77777777-7777-7777-7777-777777777777}, [ProgramFilesFolder]My App\2007\mysvc.exe

Comp 2: {42424242-4242-4242-4242-424242424242}, [ProgramFilesFolder]My App\2014\mysvc.exe

例如,如果 Win8 版本在 Win10 上运行,则不要硬编码误导性值。

注意!:请注意,上述示例 GUID 是众所周知的功能失调的 GUID,不应复制和使用!这是至关重要的:-)。

于 2018-07-18T13:08:50.013 回答