Создайте ярлык на рабочем столе для существующей папки, используя WiX - PullRequest
6 голосов
/ 22 апреля 2010

Мне нужно создать ярлык на рабочем столе для существующей FOLDER (НЕ в файл) с помощью Wix. Более подробно, моя программа установки имеет программу CustomAction, написанную с использованием C #, связанную с ней. Эта программа CustomAction создает папку с именем «BSS», путь которой выбирается пользователем.

C: \ ProgramData \ MT \ BSS

Теперь мне нужно поместить ярлык на рабочем столе в эту папку с помощью WiX. Однако я столкнулся с проблемой, поскольку в этой папке нет структуры папок в WiX. Ближайший код, который я смог найти, был следующий.

<Directory Id="DesktopFolder" Name="Desktop"/>
  <Directory Id="CommonAppDataFolder" Name="ProgramDataFolder"/>
  <Component Id="ComponentBSStrageShortcut" Guid="{8436995c-2e76-4030-b92d-c6b4bc243c43}">
    <Shortcut Id="ShortcutBSStrageShortcut"
              Directory="DesktopFolder"
              WorkingDirectory="APPLICATIONFOLDER"
              Target="[CommonAppDataFolder]/MTK/BSStrage"
              Name="BSStrage"
              Show="normal"/>
    <RegistryValue Action="write"
                   Key="SOFTWARE/MTK/BackStreet"
                   Root="HKCU"
                   Type="string"
                   KeyPath="yes"
                   Value="ApplicationFolderName"/>
  </Component>

Когда я собираю установщик таким образом, он фактически создает ярлык на рабочем столе. Однако WiX, похоже, считает, что BSStrage - это файл / приложение, поэтому он размещает ярлык для воображаемого приложения с именем BSStrage в папке C: \ ProgramData \ MT. Но двойной щелчок по нему не поможет, так как нет программы, которую можно использовать для его открытия.

Очевидно, я делаю это неправильно здесь. Может кто-нибудь, пожалуйста, помогите мне с этим, так как, как преодолеть эту проблему. Обратите внимание, что я чрезвычайно новичок в Wix (это было всего два дня) и никогда не работал с ним раньше. Любой пример кода будет очень полезен.

Ответы [ 3 ]

3 голосов
/ 14 августа 2012

Я просто столкнулся с той же проблемой; кажется, что создание тега Shortcut с атрибутом Target в форме
Target="[CommonAppDataFolder]" работает нормально, но пытается добавить подкаталоги, такие как
Target="[CommonAppDataFolder]\MTK\BSStrage" приводит к созданию ярлыка, который не работает.

К счастью, я нашел решение. Хитрость заключается в том, чтобы создать иерархию Directory тегов, ведущих к каталогу, для которого вы хотите создать ярлык, который затем содержит тег Component, содержащий тег Shortcut, например:

<Directory Id="DesktopFolder" Name="Desktop"/>
<Directory Id="CommonAppDataFolder" Name="ProgramDataFolder">
  <Directory Id="AppDataMTK" Name="MTK">
    <Directory Id="AppDataBSStrage" Name="BSStrage">
      <Component Id="ComponentBSStrageShortcut" Guid="{8436995c-2e76-4030-b92d-c6b4bc243c43}">
        <CreateFolder/>
        <Shortcut Id="ShortcutBSStrageShortcut"
                  Directory="DesktopFolder"
                  Name="BSStrage""/>
      </Component>
    </Directory>
  </Directory>
</Directory>

Обратите внимание, что целевой каталог должен существовать на момент создания ярлыка, иначе вы столкнетесь с той же проблемой: сломанный ярлык. Вот почему я добавил тег <CreateFolder/> внутри тега Component, чтобы создать каталог при установке.

2 голосов
/ 02 мая 2010

Косые черты в вашем ярлыке / @ Target должны быть обратными слешами. Вероятно, Explorer интерпретирует ваш ярлык как «Запустите CommonAppDataFolder с ключами / MTK и / BSStrage». По крайней мере, это мое первое предположение.

1 голос
/ 13 мая 2010

Я немного изменил свои требования и получил код для работы следующим образом. Изменись сейчас я создаю ярлык для папки ProgramData.

<!-- Desktop Shortcut --> 
  <Directory Id="DesktopFolder" Name="Desktop"/> 
  <Directory Id="CommonAppDataFolder" Name="ProgramDataFolder"/> 
  <Component Id="MTDesktopShortcut" Guid="{8436995c-2e76-4030-b92d-c6b4bc243c43}"> 
    <Shortcut Id="MTShortcut" 
              Directory="DesktopFolder" 
              WorkingDirectory="APPLICATIONFOLDER" 
              Target="[CommonAppDataFolder]" 
              Name="MT" 
              Show="normal"/> 
    <RegistryValue Action="write" 
                   Key="SOFTWARE/MT/BS" 
                   Root="HKCU" 
                   Type="string" 
                   KeyPath="yes" 
                   Value="ApplicationFolderName"/> 
  </Component> 

Отлично работает и отлично создает ярлык. Однако есть одна проблема, поскольку он создает ярлык на рабочем столе AllUsers, а я хочу, чтобы он был создан на рабочем столе текущего пользователя. Какие изменения я должен сделать?

Также обратите внимание, что мой установщик выполняет установку для всех пользователей, и я не могу изменить это. Мне просто нужен способ создать этот ярлык на рабочем столе текущего пользователя, в то время как установщик может выполнить установку для всех пользователей.

...