Wix создать не рекламируемый ярлык для всех пользователей / на машине
в WIX, как вы создаете не рекламируемый ярлык в профиле allusers? До сих пор я мог сделать это только с рекламируемыми ярлыками. Я предпочитаю не рекламировал ярлыки, потому что вы можете пойти в свойства ярлыка и использовать "найти цель".
в учебниках я видел использовать значение реестра для ключевого пути ярлыка. Проблема в том, что они используют HKCU в качестве корня. Когда HKCU используется, а другой пользователь удаляет программу (так как она установлена для всех пользователи) раздел реестра остается позади. Когда я использую HKMU в качестве корня, я получаю ошибку ICE57, но ключ удаляется, когда другой пользователь удаляет программу. Кажется, меня подталкивают к использованию HKCU, хотя HKMU, похоже, ведет себя правильно (для каждого пользователя против всех пользователей).
когда я пытаюсь создать не рекламируемый ярлык, я получаю различные ошибки ICE, такие как ICE38, ICE43 или ICE 57. Большинство статей, которые я видел, рекомендуют "просто игнорировать ошибки ice". Должен быть способ создать не рекламируемый ярлыки, не создавая ошибок 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 подходит для ключевого пути, если оно не является ключевым для нерекламированного ярлыка.
<?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>
хотя этот пост довольно старый, он содержит довольно полезную информацию и выглядит все еще активным. Я хочу отметить, что в целом вам не нужен фиктивный ключ реестра для вашего ярлыка! Насколько мне известно, это на 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.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>
Comments