如何使用WiX创建开始菜单中的多层子文件夹

13

如何使用WiX在Windows开始菜单中创建多层子文件夹?

目前我能够将我的快捷方式放置在开始菜单中,但只能放在程序下面的一个文件夹中(开始菜单/程序/我的文件夹),但我想将我的快捷方式嵌套得更深(例如:开始菜单/程序/我的平台/我的产品/等等)。我尝试了不同的组合,但是都失败了。

<DirectoryRef Id="StartMenuMyProduct">
    <Component Id="ApplicationShortcut" Guid="{PUT-SOME-GUID-HERE}">
        <Shortcut Id="ApplicationStartMenuShortcut"
                  Name="Configure My Product"
                  Description="Add or remove this and that"
                  Target="[MYPRODUCTDIR]ConfigureMyProduct.exe"
                  WorkingDirectory="MYPRODUCTDIR"/>
        <RemoveFolder Id="StartMenuMyProduct"
                      On="uninstall"/>
        <RemoveFolder Id="StartMenuMyPlatform"
                      On="uninstall"/>
        <RegistryValue Root="HKCU"
                       Key="SOFTWARE\MyCompany\MyPlatform\My Product"
                       Name="Installed"
                       Type="integer"
                       Value="1"
                       KeyPath="yes"/>
    </Component>
</DirectoryRef>

<!-- Shortcut to the configuration utility in the Windows Start menu -->
<Directory Id="ProgramMenuFolder">
    <!--<Directory Id="StartMenuMyPlatform" Name="MyPlatform">-->
      <Directory Id="StartMenuMyProduct" Name="My Product" />
    <!--</Directory>-->
</Directory>

好问题,我还没有尝试过... - CheGueVerra
顺便提一下,你的 GUID(如果你在意它保持“全球唯一标识符”,就不应该发布它;-))看起来是手工制作的。你应该使用随附于 Visual Studio 的 uuidgen.exe 或其他 GUID 生成器。 - Wim Coenen
呵呵,谢谢,已经改正了。是的,我知道,我从我的源代码中复制过来,然后在发布之前加了一堆零! - Levon
1个回答

22
让事情变得有趣的是,MSI要求创建一个注册表值来检测组件是否已安装。如果我们希望为所有快捷方式仅创建一个此类注册表值,则必须将所有快捷方式放在单个组件中。
幸运的是,通过利用快捷方式元素上的Directory属性,可以创建跨多个目标目录的组件。
   <!-- shortcuts to applications in the start menu -->
   <DirectoryRef Id="ProgramMenuProductFolder">
      <Component Id="ProgramMenuShortcutsComponent" Guid="PUT-GUID-HERE">
         <!-- create folders -->
         <CreateFolder Directory="ProgramMenuVendorFolder" />
         <CreateFolder Directory="ProgramMenuProductFolder" />
         <CreateFolder Directory="ProgramMenuSubFolder" />
         <!-- remove folder -->
         <RemoveFolder Id="RemoveProgramMenuVendorFolder"
            Directory="ProgramMenuVendorFolder"
            On="uninstall" />
         <RemoveFolder Id="RemoveProgramMenuProductFolder"
            Directory="ProgramMenuProductFolder"
            On="uninstall" />
         <RemoveFolder Id="RemoveProgramMenuProductSubFolder"
            Directory="ProgramMenuProductSubFolder"
            On="uninstall" />
         <!-- main shortcut -->
         <Shortcut
            Id="MainShortcut"
            Name="My Product"
            Target="[SomeInstalledFolder]app1.exe" />
         <!-- shortcut in subfolder -->
         <Shortcut
            Id="SubFolderShortcut"             
            Name="mySubFolderShortcut"
            Target="[SomeInstalledFolder]app2.exe"
            Directory="ProgramMenuProductSubFolder" />
         <!--
            RegistryValue whichs serves as KeyPath
         -->
         <RegistryValue
            Root="HKCU"
            Key="Software\MyVendor\MyProduct"
            Name="InstalledStartMenuShortcuts"
            Type="integer"
            Value="1" />
      </Component>
   </DirectoryRef>

   <!-- shortcut directories -->
   <Directory Id="ProgramMenuFolder">
      <Directory Id="ProgramMenuVendorFolder" Name="MyVendor">
         <Directory Id="ProgramMenuProductFolder" Name="MyProduct">
            <Directory Id="ProgramMenuProductSubFolder" Name="MySubFolder" />
         </Directory>
      </Directory>
   </Directory>

1
小小澄清一下,需要注册表值的不是WiX,而是MSI。我们只是在遵守无聊的要求。 - Rob Mensching
不喜欢顶这样一个老的帖子,但我正在使用此组件语法来制作我的快捷方式条目,但当我使用重要升级安装较新版本时,它们没有被正确清除,如此示例所示:http://blogs.technet.com/b/alexshev/archive/2008/02/15/from-msi-to-wix-part-8-major-upgrade.aspx。所以我先安装1.0.1.0版本,它将在开始菜单\程序\制造商\产品1.0.1.0中,如果我稍后安装1.0.2.0版本,它会升级1.0.1.0但是它会创建一个名为Start Menu\Programs\Manufacturer\Product 1.0.2.0的新条目。 如何让它正确清除? - Jack
没事了,我把产品快捷方式目录中的命名去掉了(现在称为“开始菜单\程序\制造商\产品”,而不是“开始菜单\程序\制造商\产品版本”),现在似乎可以工作了。 - Jack
1
@CandyChiu:我已经撤销了上次的编辑,显然CreateFolder元素通常是必需的。请注意,我使用Directory=属性来创建特定的文件夹,而不是默认行为,即创建组件的父文件夹。 - Wim Coenen
@RobMensching,我遇到了与Jack类似的问题,我正在对我的产品进行重大升级,但实际上我正在更改产品名称,因此旧的开始菜单文件夹没有被删除。结果我会得到两个条目,一个是旧名称,一个是新名称。如何消除旧条目? - rharrison33
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接