在WiX

时间:2015-05-26 08:03:02

标签: wix windows-installer installer

我的WiX安装程序可选择在安装时创建一个桌面快捷方式,并在卸载时删除它,CREATEDESKTOPSHORTCUT属性处理它,所以到目前为止没什么特别的。

执行主要升级时,将删除并重新创建快捷方式,将其在桌面上的位置重置为第一个空闲位置。这是默认的主要升级行为,但我如何保持其位置?

显而易见的第一种方法涉及使用WIX_UPGRADE_DETECTED属性,该属性仅在主要升级运行时出现(我仅使用主要升级)。期望的行为是

  • 如果尚未安装产品且CREATEDESKTOPSHORTCUT为真
  • ,请在初始安装时创建快捷方式
  • 请勿触摸主要升级的快捷方式(例如,如果存在WIX_UPGRADE_DETECTED),无论是否在初始安装时创建
  • 卸载产品时删除快捷方式,以及是否已在初始安装时创建

有没有办法实现这一目标?我想它可能会归结为快捷方式ConditionComponent中的Feature元素,但我不会将其启动并运行。

修改

一种可能的方法是使快捷方式创建组件永久化,并引入一个仅在删除产品时触发(而不是主要升级)的附加组件,并明确地从桌面删除链接文件:

<DirectoryRef Id="DesktopFolder">
    <Component Id="CreateDesktopLink" Guid="My-GUID-1" Permanent="yes">
       <RegistryValue ... />
       <Shortcut Id="CmdShortcut" Name="My Desktop Link" Target="[SystemFolder]cmd.exe" />
    </Component>
    <Component Id="RemoveDesktopLink" Guid="My-GUID-2">
      <RegistryValue ... />
      <RemoveFile Id="RemoveDesktopLinkFile" Name="My Desktop Link.lnk" On="uninstall" />
      <Condition>REMOVE=ALL AND NOT WIX_UPGRADE_DETECTED</Condition>
    </Component>
</DirectoryRef>

虽然这会在卸载时留下孤立的组件。或者,我可以将快捷方式创建移动到自定义操作中,从而消除永久组件。

赞赏任何意见。

2 个答案:

答案 0 :(得分:0)

如何排序&#34; RemoveExistingProducts&#34; InstallFinalize之后的标准操作?

这样做意味着安装了较新的产品,然后卸载旧产品。安装较新的产品时,创建快捷方式的组件的引用计数将增加到2,因此在卸载旧产品时,创建快捷方式的组件将不受影响。

我只是认为这是另一种可能的解决方案。

然而,重新排序&#34; RemoveExistingProducts&#34;是你必须深思熟虑的东西。

此致 Kiran Hegde

答案 1 :(得分:0)

您无法保留快捷方式 - 至少不是默认情况下广告的快捷方式。这些快捷方式包含对产品,组件和功能的引用,有时还包含可能位于缓存的MSI的二进制表中的图标。其中至少有两个会因升级而改变。

这将为您留下未经广告的快捷方式或您自己创建的快捷方式,尝试保留该位置可能会有效。

也许您可以枚举桌面图标(搜索包含代码示例),这样您就可以将图标放回原来的位置,因为这样可以适用于所有类型的快捷方式,您无需更改升级逻辑。只需找出它当前的位置,然后在安装后再次找到它并将其移动到原始位置。