Wix створює нерекламований ярлик для всіх користувачів / на машину


81

Як у WIX створюється нерекламований ярлик у профілі алюзорів? Поки що мені вдалося досягти цього лише за допомогою рекламованих ярликів. Я віддаю перевагу нерекламованим ярликам, оскільки ви можете перейти до властивостей ярлика та скористатися функцією "знайти ціль".

У підручниках, які я бачив, використовуйте значення реєстру для шляху до ярлика. Проблема в тому, що вони використовують HKCU як корінь. Коли використовується HKCU, а інший користувач видаляє програму (оскільки вона встановлена ​​для всіх користувачів), ключ реєстру залишається позаду. Коли я використовую HKMU як корінь, я отримую помилку ICE57, але ключ видаляється, коли інший користувач видаляє програму. Здається, мене підштовхують до використання HKCU, хоча HKMU, здається, поводиться коректно (на користувача проти всіх користувачів).

Коли я намагаюся створити нерекламований ярлик, я отримую різні помилки ICE, такі як ICE38, ICE43 або ICE 57. Більшість статей, які я бачив, рекомендують "просто ігнорувати помилки льоду". Повинен бути спосіб створити нерекламовані ярлики, не створюючи помилок ICE.

Будь ласка, опублікуйте зразок коду для робочого прикладу.

Відповіді:


113

Вибачте, якщо це поганий етикет, щоб відповісти на власне запитання.

Нещодавно я натрапив на інформацію про власність 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, якщо це не шлях для нерекламованого ярлика.

<?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. Дякую!
Дейв

7
Чудова відповідь. Але припустимо, у мене є ярлик на робочому столі в окремому компоненті (оскільки я встановлюю його умовно). Такі ярлики IIUC не можна рекламувати. Якщо я спробую додати Advertise = "yes" навіть із DISABLEADVTSHORTCUTS, я отримую помилку CNDL0035. Чи можете ви побачити спосіб зробити такий ярлик за допомогою ключа реєстру HKMU?
marcin

9
Відповісти на власне запитання - це зовсім не поганий етикет, якщо ви знайшли хороше рішення, і я дуже вдячний вам - і з чудовою відповіддю на завантаження. +1!
fzwo

Не посилайте піктограму на виконуваний файл. Піктограми копіюються в спеціальний каталог (Windows \ Installer \ {GUID}), і ярлик буде використовувати піктограму з цього місця (тобто не з виконуваного файлу в INSTALLDIR), тому краще використовувати окремий файл значків.
Дмитро Азараєв

Дуже дякую. Я цілими годинами вирішував це. Не мав поняття про DISABLEADVTSHORTCUTS.
Джейсон Хьюз,

8

Хоча ця публікація досить стара, вона містить досить корисну інформацію та виглядає як і раніше активною. Я хочу зазначити, що загалом вам не потрібен фіктивний ключ реєстру для вашого ярлика! 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>

Зауважте, що це поєднає ваш ярлик разом із виконуваним файлом в один компонент. Якщо вас це турбує, використовуйте фіктивний ключ реєстру (як у дуже добре поясненій прийнятій самовідповіді).


1
Не забудьте додати <Property Id = "DISABLEADVTSHORTCUTS" Value = "1" /> до елемента Product
sartoris

@sartoris це слід додати до відповіді. Без цього це не працює.
Олексій Жуковський,

2

Погляньте на Від 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>

9
Ваш приклад використовує "HKCU" як шлях шляху. Якщо один користувач встановить програму, а інший користувач видалить її, ключ реєстру залишиться позаду. Перше опубліковане посилання використовує HKCU для ключа реєстру. Другий використовує файл як шлях шляху, який видає помилки ICE43 та ICE57.
mcdon

1
Ключ реєстру, так. Однак не сам ярлик :)
saschabeaumont
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.