Что интересно, так это то, что 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>