WiX 3 сводит меня с ума-попытка создать ярлык на рабочем столе
У меня есть приложение, которое устанавливается с WiX 3 - большая часть установки уже работает нормально, но попытка заставить ярлык рабочего стола работать, кажется, стоит мне ума...
У меня установлено приложение, и у меня уже есть ярлык в папке меню Пуск - работает просто отлично. Но как мне запустить ярлык на рабочем столе?
<Product Id="*" Name="....." UpgradeCode="MY-GUID">
<Package Id="*" InstallerVersion="200" Compressed="yes" />
<Media Id="1" Cabinet="foobar.cab" EmbedCab="yes" />
<Property Id="ALLUSERS">1</Property>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="FooBar"/>
</Directory>
<Directory Id="DesktopFolder" SourceName="Desktop"/>
<Directory Id="ProgramFilesFolder">
<Directory Id="FoobarDir" Name="FOOBAR">
<Directory Id="INSTALLLOCATION" Name="FooApp">
<Component Id="MainFiles" Guid=".....">
<File Id="FooMainApp" Source="FooMainApp.exe" />
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
....
<!-- this shortcut here works just fine ... -->
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="AppShortcut" Guid="...">
<Shortcut Id="ApplicationStartMenuShortcut"
Name="FooBarApp" Description="..."
Target="[INSTALLLOCATION]FooMainApp.exe"
WorkingDirectory="INSTALLLOCATION"/>
</Component>
</DirectoryRef>
<!-- but this shortcut here never seems to work .. ... -->
<DirectoryRef Id="DesktopFolder">
<Component Id="DesktopShortcut" Guid="....." >
<Shortcut Id="DesktopAppShortcut"
Advertise="no"
Name="FooBarApp" Description="...."
Target="[INSTALLLOCATION]FooMainApp.exe"
WorkingDirectory="INSTALLLOCATION"/>
</Component>
</DirectoryRef>
Ошибки, которые я постоянно получаю:
ICE18: ключевого компонента: "DesktopShortcut" - это каталог: 'DesktopFolder'. То Пара каталог / компонент должна быть перечислены в таблице CreateFolders.
ICE38: компонент DesktopShortcut устанавливается в профиль пользователя. Он должен использовать ключ реестра в HKCU качестве Ключ, а не файл.
ICE43: компонент DesktopShortcut не рекламируется ярлыки. Он должен использовать реестр ключ в HKCU, как его путь, не файл.
Я не понимаю, что на земле пытается сказать мне установщик WiX 3 / Windows здесь.... кто-нибудь??
Оба компонента, AppShortcut
и DesktopShortcut
, На самом деле являются частью "главной" функции - я не вижу здесь никакой проблемы. Я не могу понять, что здесь может быть не так....
Обновление: ОК, поэтому я добавил некоторые разделы реестра в ярлык на рабочем столе
<Component Id="DesktopShortcut" Guid="BF3587B4-F52E-411E-8814-CFCBF8201C0D">
<RegistryKey Root="HKCU" Key="SoftwareFoo IncFooBarAppInstalled"
Action="createAndRemoveOnUninstall">
<RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes"/>
</RegistryKey>
<Shortcut Id="DesktopShortcut" Directory="DesktopFolder"
Name="FooBar" WorkingDirectory="INSTALLLOCATION"
Icon="foobar.ico"
Target="[INSTALLOCATION]FooMainApp.exe"/>
</Component>
Теперь сообщения ICE исчезли, но когда я пытаюсь установить приложение, я получаю ошибку 1909 - целевая папка не существует, или у вас нет разрешения на запись в нее (или что-то вроде что)
Обновление 2: приведенный выше пример кода работает на Win XP, Но он продолжает отказывать на Win Server 2003 : - (есть еще идеи??
5 ответов:
Вот рабочий пример из нашего живого производственного кода...
<Fragment> <Component Id="DesktopShortcut" Directory="APPLICATIONFOLDER" Guid="*"> <RegistryValue Id="RegShortcutDesktop" Root="HKCU" Key="SOFTWARE\ACME\settings" Name="DesktopSC" Value="1" Type="integer" KeyPath="yes" /> <Shortcut Id="desktopSC" Target="[APPLICATIONFOLDER]MyApp.exe" Directory="DesktopFolder" Name="My Application" Icon="$(var.product).ico" IconIndex="0" WorkingDirectory="APPLICATIONFOLDER" Advertise="no"/> </Component> </Fragment>
Это основано на ответе @saschabeaumont, но, надеюсь, с некоторыми дополнительными полезными советами для нас, начинающих WiX (это кошмар для всех, чтобы учиться???).
Сначала создайте фрагмент, содержащий сведения о самом ярлыке:
<Fragment> <Component Id="DesktopShortcut" Directory="INSTALLFOLDER" Guid="*"> <RegistryValue Id="RegShortcutDesktop" Root="HKCU" Key="Software\Company\ApplicationName" Name="DesktopSC" Value="1" Type="integer" KeyPath="yes" /> <Shortcut Id="desktopSC" Target="[INSTALLFOLDER]ApplicationName.exe" WorkingDirectory="INSTALLFOLDER" Icon="icon.ico" Directory="DesktopFolder" Name="ApplicationName" Advertise="no"/> </Component> </Fragment>
Далее заметим, что этот фрагмент нужно будет включить в
Product element
, например:<Feature Id="ProductFeature" Title="Your Application Title" Level="1"> ... <ComponentRef Id="DesktopShortcut" /> </Feature>
ProductFeature
, скорее всего, будет содержать другие фрагменты, такие как файлы и фрагмент ярлыка меню программы.Кроме того,
DesktopFolder
потребуется ссылка вTARGETDIR directory element
(которая, скорее всего, будет содержать другие папки, такие какProgramMenuFolder
, Как вам требуется), например:<Directory Id="TARGETDIR" Name="SourceDir"> ... <Directory Id="DesktopFolder" Name="Desktop"/> </Directory>
Каждое из этих сообщений ICE в основном жалуется на одно и то же: компонент, устанавливающий ярлык, должен иметь запись реестра в качестве своего ключевого ключа . Чтобы исправить это, добавьте что-то вроде этого к компоненту:
<RegistryValue Root="HKCU" Key="Software\MyCompany\MyApplicationName" Name="desktopShortcut" Type="integer" Value="1" KeyPath="yes"/>
То же самое относится и к компоненту, устанавливающему ярлык меню Пуск. Взгляните на соответствующий пример документацииwix о создании ярлыка .
Моя цель-создать ссылку быстрого доступа в интернет и поместить ее на рабочий стол. Вот код, который работает для меня:
<?xml version="1.0" encoding="utf-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> <Product Id="09F1B63D-FB03-43FD-A326-FD49F93D00C8" Name="TestProduct" Language="1033" Version="0.0.0.1" Manufacturer="WixEdit" UpgradeCode="6B2F9AB4-73A6-45CB-9EC4-590D1AAA6779"> <Package Description="Test file in a Product" Comments="Simple test" InstallerVersion="200" Compressed="yes" /> <Media Id="1" Cabinet="simple.cab" EmbedCab="yes" /> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder" Name="PFiles"> <Directory Name="AAAA" Id="AAABBB"> <Component Id="AAAA"> <File Id="AAAA.EXE" Name="AAAA.exe" Source="U:\web\bin\x86\Release\AAAA.exe" /> </Component> </Directory> </Directory> <Directory Id="DesktopFolder"> <Component Id="StartMenuShortcuts" Guid="E8EDD7BC-9762-4C3D-8341-FAEC983D318A"> <RemoveFolder Id="ProgramMenuDir" On="uninstall" /> <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" /> <util:InternetShortcut Id="WebsiteShortcut" Name="AAAA Website" Target="http://www.AAAA.com" /> </Component> </Directory> </Directory> <Feature Id="DefaultFeature" Title="Main Feature" Level="1"> <ComponentRef Id="StartMenuShortcuts" /> <ComponentRef Id="AAAA" /> </Feature> <UI /> </Product> </Wix>
Примечание: вам нужно добавить следующие строки команд candle и light: - ext WiXUtilExtension
Не уверен, что это было доступно еще в 2010 году, но вот как я делаю это в WiX 3.7:
<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>