Вопрос по windows-installer, wix, shortcut, installer – Создать ярлык на рабочий стол с помощью WiX

53

Итак, у меня есть этот проект установки в Wix, и я хотел иметь ярлык на рабочем столе. Это должно быть легко, вы можете подумать. Но это не тот случай. Все фрагменты кода, найденные в Интернете, не работали. После нескольких часов борьбы и прочтения документации я наконец понял это правильно, поэтому я делюсь этим с вами здесь.

Это то, что я чувствую с таким большим количеством технологий Майкрософт. Эти дни. Этот комментарий приходит почти три года спустя. так очевидно, что уровень техники не улучшился. Ian Ray

Ваш Ответ

5   ответов
15

& quot; Ошибка 3 ICE43: Компонент ... имеет не объявленные ярлыки. Он должен использовать ключ реестра в HKCU в качестве KeyPath, а не файл. & Quot;

Таким образом, я сделал это таким образом в файле с функциями:

   <Component Id="cmp79F6D61F01DD1060F418A05609A6DA70" 
              Directory="dirBin" Guid="*">
      <File Id="fil34B100315EFE9D878B5C2227CD1454E1" KeyPath="yes"
            Source="$(var.SourceDir)\FARMS.exe" >
        <Shortcut Id="DesktopShortcut"
                  Directory="DesktopFolder"
                  Name="FARMS $(var.FarmsVersion)"
                  Description="Local Land Services desktop application"
                  WorkingDirectory="INSTALLFOLDER"
                  Icon="FARMS.exe"
                  IconIndex="0"
                  Advertise="yes" >
           <Icon Id="FARMS.exe" SourceFile="$(var.SourceDir)\FARMS.exe" />
        </Shortcut>
        </File>
    </Component>

И упоминается папка рабочего стола в файле с описанием продукта:

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="DesktopFolder" Name="Desktop" />

      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="FARMS" >
        </Directory>
      </Directory>
    </Directory>
  </Fragment>
70

Не забудьте поместить компонент в свой тег функции.

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="DesktopFolder" Name="Desktop">
        <Component Id="ApplicationShortcutDesktop" Guid="*">
            <Shortcut Id="ApplicationDesktopShortcut"
                Name="Text under your icon"
                Description="Comment field in your shortcut"
                Target="[MYAPPDIRPROPERTY]MyApp.exe"
                WorkingDirectory="MYAPPDIRPROPERTY"/>
            <RemoveFolder Id="DesktopFolder" On="uninstall"/>
            <RegistryValue
                Root="HKCU"
                Key="Software/MyAppName"
                Name="installed"
                Type="integer"
                Value="1"
                KeyPath="yes"/>
        </Component>
    </Directory>

    <Directory Id="ProgramFilesFolder" Name="PFiles">
        <Directory Id="MyCompany" Name="MyCompany">
            <Directory Id="MYAPPDIRPROPERTY" Name="MyAppName">
                <!-- main installation files -->
            </Directory>
        </Directory>
    </Directory>
</Directory>
Не публиковать жестко закодированные GUID. ПоложилGuid="*" вместо этого для автоматического создания guid или используйте {PUT-GUID-HERE}
для чего это значение реестра?
@BatteryBackupUnit Ярлык не может быть ключевым путем для компонента, поэтому значение реестра служит для этой цели. Тот же метод используется в документации WiX:wixtoolset.org/documentation/manual/v3/howtos/…
Мне пришлось добавить это в тег функции: & lt; ComponentRef Id = & quot; ApplicationShortcutDesktop & quot; / & GT;
Лучше поместить идентификатор файла для свойства Target вместо «[MYAPPDIRPROPERTY] MyApp.exe».
3

документация.

Во-первых, вы должны указать свой DesktopFolder,

   <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="DesktopFolder" Name="Desktop"/>

Затем вы должны создать компонент ярлыка для файла, для которого вы хотите создать ярлык.

  <Component Id="PutYourComponentIdHere" Directory="FileDirectory" Guid="*">
    <File Id="NotYourComponentId" KeyPath="yes" Source="..\YourFileSource\YourExecutable.exe">
      <Shortcut Id="desktopServer" Directory="DesktopFolder" Name="YourShourtcutName" WorkingDirectory='WhereShouldYourShortcutPoint' Advertise="yes"/>
    </File>
  </Component>

Это сработало для меня. Мне нужно поставить значок, но это легко. Надеюсь, что это работает.

1

<Product ...>
    <Feature Id="ProductFeature" Title="SetupProject" Level="1">
      ...
      ...
      <ComponentRef Id="cmpDesktopShortcut" />
    </Feature>

    <Component Id="cmpDesktopShortcut" Guid="PUT-GUID-HERE" Directory="DesktopFolder" >
        <Shortcut Id="MyDesktopShortcut" 
                  Name="Setup Project" 
                  Description="Opens the program." 
                  Directory="DesktopFolder" 
                  Target="[INSTALLFOLDER]App.exe"
                  WorkingDirectory="INSTALLFOLDER"/>
        <RegistryValue Root="HKCU" Key="Software\My Company\Sample Application" Name="installed" Type="integer" Value="1" KeyPath="yes" />
    </Component>
</Product>
27

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="DesktopFolder" SourceName="Desktop" />
  <Directory Id="MergeRedirectFolder">
    <Component Id="MyExeComponent" Guid="{PUT-GUID-HERE}">
      <File Id="MyExeFile" Source="$(var.ExeSourcePath)" KeyPath="yes">
        <Shortcut
          Id="DesktopShortcut"
          Directory="DesktopFolder"
          Name="$(var.ShortcutName)"
          WorkingDirectory="MergeRedirectFolder" />
      </File>
    </Component>
  </Directory>
</Directory>
сам файловый компонент является ключевым путем, ярлык «наследует» свойства файла. Этот способ может быть немного запутанным, хотя, когда вы пытаетесь отследить этот ярлык на рабочем столе среди множества файлов ... предпочтения пользователей относительно компактности и прослеживаемости, я думаю?
В большинстве случаев вам не нужно устанавливать рабочий каталог ярлыка в каталог, в который установлено приложение.
Отdocumentation в отношении раздела реестра:"This is required as a Shortcut cannot serve as the KeyPath for a component when installing non-advertised shortcuts for the current users."

Похожие вопросы