Ярлыки конфликтов разных программ - PullRequest
0 голосов
/ 03 февраля 2020

Есть два проекта Wix, которые устанавливают утилиты от одного производителя. При установке программ ярлыки создаются в меню программ. Поскольку программы принадлежат одному и тому же производителю, в каталоге C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ManufacturerName\ создаются подпапки с именами установленных программ, например %ProgramMenuFolder%ManufacturerName\BlaBlaOne и %ProgramMenuFolder%ManufacturerName\BlaBlaTwo. Обе программы используют ярлыки для вызова cmd.exe. Например:

<Component Id="Shortcut.ProgramsMenu.AddBlaBlaOne" Guid="????????-C0F0-4C6D-8032-20731B4D7AB4">
  <Shortcut Id="Shortcut.ProgramsMenu.AddBlaBlaOne"
            Name="!(loc.AddBlaBlaOne)"
            Description="!(loc.AddBlaBlaOne)"
            Icon="add.ico"
            Target="[SystemFolder]cmd.exe"
            Arguments='/K add.bat &amp;&amp; exit'
            WorkingDirectory="INSTALLDIR">
    <ShortcutProperty Key="System.AppUserModel.PreventPinning" Value="1" />
    <ShortcutProperty Key="System.AppUserModel.ExcludeFromShowInNewInstall" Value="1" />
  </Shortcut>
  <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]"
                 Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>

<Component Id="Shortcut.ProgramsMenu.DeleteBlaBlaOne" Guid="????????-D823-49D9-9756-A9E29E81DDA9">
  <Shortcut Id="Shortcut.ProgramsMenu.DeleteBlaBlaOne"
            Name="!(loc.DeleteBlaBlaOne)"
            Description="!(loc.DeleteBlaBlaOne)"
            Icon="delete.ico"
            Target="[SystemFolder]cmd.exe"
            Arguments='/K delete.bat &amp;&amp; exit'
            WorkingDirectory="INSTALLDIR">
    <ShortcutProperty Key="System.AppUserModel.PreventPinning" Value="1" />
    <ShortcutProperty Key="System.AppUserModel.ExcludeFromShowInNewInstall" Value="1" />
  </Shortcut>
  <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]"
                 Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>

После установки второй программы ярлыки первой программы не отображаются в меню программ, хотя физически ярлыки присутствуют, и это можно проверить в Windows Explorer. Чтобы установить ярлыки для второй программы, используйте следующий код:

<Component Id="Shortcut.ProgramsMenu.AddBlaBlaTwo" Guid="????????-80E0-4D2A-933E-D9CCC88D7E27">
  <Shortcut Id="Shortcut.ProgramsMenu.AddBlaBlaTwo"
            Name="!(loc.AddBlaBlaTwo)"
            Description="!(loc.AddBlaBlaTwo)"
            Icon="add.ico"
            Target="[SystemFolder]cmd.exe"
            Arguments='/K add.bat &amp;&amp; exit'
            WorkingDirectory="INSTALLDIR">
    <ShortcutProperty Key="System.AppUserModel.PreventPinning" Value="1" />
    <ShortcutProperty Key="System.AppUserModel.ExcludeFromShowInNewInstall" Value="1" />
  </Shortcut>
  <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]"
                 Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>

<Component Id="Shortcut.ProgramsMenu.DeleteBlaBlaTwo" Guid="????????-AE2C-4EF7-A99F-70507DE5F638">
  <Shortcut Id="Shortcut.ProgramsMenu.DeleteBlaBlaTwo"
            Name="!(loc.DeleteBlaBlaTwo)"
            Description="!(loc.DeleteBlaBlaTwo)"
            Icon="delete.ico"
            Target="[SystemFolder]cmd.exe"
            Arguments='/K delete.bat &amp;&amp; exit'
            WorkingDirectory="INSTALLDIR">
    <ShortcutProperty Key="System.AppUserModel.PreventPinning" Value="1" />
    <ShortcutProperty Key="System.AppUserModel.ExcludeFromShowInNewInstall" Value="1" />
  </Shortcut>
  <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]"
                 Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>

Как видите, при объявлении меток все атрибуты и имена различаются. Только аргументы и значок ярлыка здесь одинаковы. Имена bat-файлов одинаковы, но каждая программа имеет свое содержимое. Если я изменю аргументы ярлыков и имена bat-файлов, чтобы они различались, то все работает.

...
Arguments='/K addBlaBlaOne.bat &amp;&amp; exit'
...
Arguments='/K deleteBlaBlaOne.bat &amp;&amp; exit'
...
Arguments='/K addBlaBlaTwo.bat &amp;&amp; exit'
...
Arguments='/K deleteBlaBlaTwo.bat &amp;&amp; exit'

Я не смог найти информацию об этом неожиданном поведении в документации Wix.
Почему Бывает? Могу ли я использовать те же имена bat-файлов в аргументах вызова cmd.exe? Что я делаю не так?

...