如何使用WiX安装嵌套子目录的快捷方式

时间:2014-06-26 22:55:03

标签: windows wix windows-installer

这是Wix - Keeping track of installed applications的重复,但接受的答案只是表明可以做一些不同于所要求的事情。

所以,(在WiX中)如何让Per Machine安装程序为来自单个公司的单独产品制作,每个产品都有开始菜单/程序/ CompanyName / ProductName下的快捷方式(每个产品的ProductName更改),以便开始菜单/程序当且仅当所有产品都已卸载时,/ CompanyName才会被删除?

具体名称无关紧要,但为了便于讨论,假设CompanyName是ExampleLLC,其产品名为ProductA,ProductB和ProductC。假设每个产品都有一个单独的安装程序,并且快捷方式分别是由同一产品安装程序安装的文件。因此,分别将它们称为RunA,RunB和RunC,分别针对ProductA.exe,ProductB.exe和ProductC.exe。

要清楚“开始菜单/程序”映射到Windows 7下的“C:\ Users \ All Users \ Microsoft \ Windows \ Start Menu \ Programs”,但其他操作系统版本的映射方式不同。

注意:答案必须适用于perMachine安装,如果必须忽略ICE警告,请提及它们。

这听起来微不足道,但是WiX和安装程序SDK会在我尝试的所有内容中发出错误或警告。他们需要一个“密钥”来检查机器上是否仍存在某些东西(或其集合),并且对目录和快捷方式都有偏差作为密钥。并且他们对每个用户安装的项目提出了特殊要求,但是不相信“ProgramMenuFolder”不是每个用户进行“perMachine”安装。

2 个答案:

答案 0 :(得分:0)

只需将安装快捷方式的相同组件(具有相同的GUID)包含在两个产品中。 MSI将自行计算和处理已安装的组件。

答案 1 :(得分:0)

忽略ICE64(即告诉light.exe这样做)和“就这样做”。 但请使用广告快捷方式或查看问题Wix create non advertised shortcut for all users / per machine 如果您执行这两项操作,“CompanyName”的额外嵌套级别将无关紧要。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="ProductA" Language="1033" Version="1.0.0.0" Manufacturer="ExampleLLC" UpgradeCode="YOUR_GUID_HERE">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <Media Id="1" Cabinet="Setup.cab" EmbedCab="yes" CompressionLevel="high" />

    <Property Id="DISABLEADVTSHORTCUTS" Value="1" />

    <Directory Id="TARGETDIR" Name="SourceDir">

      <Directory Id="ProgramMenuFolder">
        <Directory Id="MyStartMenuCompanyFolder" Name="ExampleLLC">
          <Directory Id="MyStartMenuProductFolder" Name="ProductA" />
        </Directory>
      </Directory>

      <Directory Id="ProgramFilesFolder">
        <Directory Id="MyProgramFilesCompanyFolder" Name="ExampleLLC">
          <Directory Id="MyProgramFilesProductFolder" Name="ProductA">
            <Component Id="ProductA.exe">
              <File Source="../ProductA/bin/$(var.Configuration)/ProductA.exe" KeyPath="yes">
                <Shortcut Id="RunA" Name="RunA" Directory="MyStartMenuProductFolder" Advertise="yes"/>
              </File>
            </Component>
          </Directory>
        </Directory>
      </Directory>

    </Directory>

    <Feature Id="Complete" Level="1">
      <ComponentRef Id="ProductA.exe" />
    </Feature>
  </Product>
</Wix>

生成2个ICE错误实例64抱怨每个目录(MyStartMenuProductFolder和MyStartMenuCompanyFolder)“在用户配置文件中但未在RemoveFile表中列出”。

如果制作一个重复的WiX文件替换ProductB替换ProductA(和RunB for RunA),那么忽略此错误会使安装程序完成他们应该做的事情。

所以不要相信ICE64暗示在卸载时不会删除某些内容。忽略错误,只测试安装程序。

注意:此错误与额外的目录级别无关,但是在尝试躲避它并与ICE43和ICE57进行战斗时,如果您尝试使用非广告的快捷方式,则会弹出“让我陷入困境” “使用内部目录(MyStartMenuProductFolder)作为组件的KeyPath,仅包含RunA快捷方式。哪个工作正常,但留下了外部目录(MyStartMenuCompanyFolder)的ICE64警告。