Wix создать не рекламируемый ярлык для всех пользователей / на машину
Как в WIX создать нерекламированный ярлык в профиле allusers? До сих пор мне удавалось добиться этого только с помощью рекламируемых ярлыков. Я предпочитаю не рекламируемые ярлыки, потому что вы можете перейти к свойствам ярлыка и использовать "найти цель".
В обучающих программах, которые я видел, используйте значение реестра для ключевого пути ярлыка. Проблема в том, что они используют HKCU в качестве корня. Когда используется HKCU, и другой пользователь удаляет программу (поскольку она установлена для всех пользователей), ключ реестра остается позади. Когда я использую HKMU в качестве root, я получаю ошибку ICE57, но ключ удаляется, когда другой пользователь удаляет программу. Кажется, я склоняюсь к использованию HKCU, хотя HKMU, кажется, ведет себя правильно (для каждого пользователя против всех пользователей).
Когда я пытаюсь создать нерекламированный ярлык, я получаю различные ошибки ICE, такие как ICE38, ICE43 или ICE 57. В большинстве статей, которые я видел, рекомендуется "просто игнорировать ошибки льда". Должен быть способ создания не объявленных ярлыков, без создания ошибок ICE.
Пожалуйста, отправьте пример кода для рабочего примера.
3 ответа
Извините, если это плохой этикет, чтобы ответить на мой собственный вопрос.
Недавно я наткнулся на информацию о собственности DISABLEADVTSHORTCUTS. Я создал установку с объявленными ярлыками и установил для свойства DISABLEADVTSHORTCUTS значение 1, что привело к появлению нерекламированных ярлыков. Это обходит ошибки ICE43, потому что объявленный ярлык может использовать файл в качестве пути к ключу. Поскольку DISABLEADVTSHORTCUTS был установлен, установщик Windows заменит эти объявленные ярлыки обычными ярлыками.
Я установил атрибут InstallScope элемента пакета на "perMachine". Это устанавливает для свойства ALLUSERS значение 1. Значения ProgramMenuFolder и DesktopFolder будут преобразованы в профиль "Все пользователи".
Для папок, созданных в ProgramMenuFolder, есть элементы RemoveFolder и RegistryValue. Примеры, которые я видел ( ex1, ex2), используют HKCU в качестве корня для RegistryValue. Я изменил этот корень на HKMU, который преобразуется в HKCU или HKLM в зависимости от значения ALLUSERS.
Короче говоря, если для DISABLEADVTSHORTCUTS задано значение 1, ваши объявленные ярлыки не будут вызывать ошибок ICE, но при установке будут преобразованы в не объявленные ярлыки. RegistryValue с корневым HKMU подходит для KeyPath, если он не является keypath для нерекламированного ярлыка.
<?xml version="1.0" encoding="utf-8"?>
<!-- This example is based on SampleFirst by Gábor DEÁK JAHN, Tramontána:
http://www.tramontana.co.hu/wix/lesson1.php#1.3
Original SampleFirst:
http://www.tramontana.co.hu/wix/download.php?file=samples/samplefirst.zip&type=application/zip -->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Name="Foobar 1.0" Id="YOURGUID-21F1-4026-ABD2-7CC7F8CE4D18" UpgradeCode="YOURGUID-AFA4-46C6-94AA-EEE3D104F903" Language="1033" Codepage="1252" Version="1.0.0" Manufacturer="Acme Ltd.">
<Package Id="*" Keywords="Installer" Description="Acme's Foobar 1.0 Installer" Comments="Foobar is a registered trademark of Acme Ltd." Manufacturer="Acme Ltd." InstallerVersion="100" Languages="1033" Compressed="yes" SummaryCodepage="1252" InstallScope="perMachine" />
<Media Id="1" Cabinet="Sample.cab" EmbedCab="yes" DiskPrompt="CD-ROM #1" />
<Property Id="DiskPrompt" Value="Acme's Foobar 1.0 Installation [1]" />
<Property Id="DISABLEADVTSHORTCUTS" Value="1" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="Acme" Name="Acme">
<Directory Id="INSTALLDIR" Name="Foobar 1.0">
<Component Id="MainExecutable" Guid="YOURGUID-3E4F-47A2-86F1-F3162E9C4798">
<File Id="FoobarEXE" Name="FoobarAppl10.exe" DiskId="1" Source="FoobarAppl10.exe" KeyPath="yes">
<Shortcut Id="startmenuFoobar10" Directory="ProgramMenuDir" Name="Foobar 1.0" WorkingDirectory="INSTALLDIR" Icon="Foobar10.exe" IconIndex="0" Advertise="yes" />
<Shortcut Id="desktopFoobar10" Directory="DesktopFolder" Name="Foobar 1.0" WorkingDirectory="INSTALLDIR" Icon="Foobar10.exe" IconIndex="0" Advertise="yes" />
</File>
</Component>
<Component Id="HelperLibrary" Guid="YOURGUID-C7DA-4C02-A2F0-A6E089FC0CF3">
<File Id="HelperDLL" Name="Helper.dll" DiskId="1" Source="Helper.dll" KeyPath="yes" />
</Component>
<Component Id="Manual" Guid="YOURGUID-FF92-4BF4-A322-819A3B2265A0">
<File Id="Manual" Name="Manual.pdf" DiskId="1" Source="Manual.pdf" KeyPath="yes">
<Shortcut Id="startmenuManual" Directory="ProgramMenuDir" Name="Instruction Manual" Advertise="yes" />
</File>
</Component>
</Directory>
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder" Name="Programs">
<Directory Id="ProgramMenuDir" Name="Foobar 1.0">
<Component Id="ProgramMenuDir" Guid="YOURGUID-D1C2-4D76-BA46-C6FA79862E77">
<RemoveFolder Id="ProgramMenuDir" On="uninstall" />
<RegistryValue Root="HKMU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" />
</Component>
</Directory>
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
</Directory>
<Feature Id="Complete" Level="1">
<ComponentRef Id="MainExecutable" />
<ComponentRef Id="HelperLibrary" />
<ComponentRef Id="Manual" />
<ComponentRef Id="ProgramMenuDir" />
</Feature>
<Icon Id="Foobar10.exe" SourceFile="FoobarAppl10.exe" />
</Product>
</Wix>
Хотя этот пост довольно старый, он содержит довольно полезную информацию и выглядит все еще активным. Я хочу отметить, что в общем случае вам НЕ нужен фиктивный ключ реестра для вашего ярлыка! AFAIK, это учебник WiX и не MSI или сертификационные требования. Вот пример без ключа reg:
<Fragment Id="Folders">
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="MyApp">
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder">
<Directory Id="MyAppStartMenuDir" Name="MyApp"/>
</Directory>
</Directory>
</Fragment>
<Fragment Id="Components">
<Component Id="MyAppComp" Directory="INSTALLFOLDER" ...>
<!--The advertise flag below is to bypass ICE errors in WiX, the actual shortcut will not be advertises if those are disabled globally with DISABLEADVTSHORTCUTS-->
<File ..." KeyPath="yes">
<Shortcut Id="MyAppStartMenuLink" Directory="MyAppStartMenuDir" Advertise="yes" ... />
</File>
<RemoveFolder Id="StartMenuDirRemoved" Directory="MyAppStartMenuDir" On="uninstall" />
</Component>
</Fragment>
Обратите внимание, что это поместит ваш ярлык вместе с исполняемым файлом в один компонент. Если это вас беспокоит, тогда используйте фиктивный ключ реестра (как в очень хорошо объясненном принятом самостоятельном ответе).
Взгляните на " От MSI до WiX", часть 10 - Ярлыки Алекса Шевчука.
Или сообщение в блоге Роба Менчинга Как создать ярлык для удаления (и пройти все проверки ICE).
В основном ICE57 довольно раздражает... но вот (кажется, работает) код, который я использую для ярлыков на рабочем столе:)
<Component Id="DesktopShortcut" Directory="APPLICATIONFOLDER" Guid="*">
<RegistryValue Id="RegShortcutDesktop" Root="HKCU" Key="SOFTWARE\My App\1.0\settings" Name="DesktopSC" Value="1" Type="integer" KeyPath="yes" />
<Shortcut Id="desktopSc" Target="[APPLICATIONFOLDER]MyApp.exe" Directory="DesktopFolder" Name="My Applications" Icon="myapp.ico" IconIndex="0" WorkingDirectory="APPLICATIONFOLDER" Advertise="no"/>
<RemoveFolder Id="RemoveShortcutFolder" On="uninstall" />
<Condition>DT_SHORTCUT=1</Condition>
</Component>