Wix tworzy niereklamowane skróty dla wszystkich użytkowników / na komputer

81

W WIX, jak utworzyć niereklamowany skrót w profilu allusers? Jak dotąd udało mi się to osiągnąć tylko za pomocą reklamowanych skrótów. Preferuję niereklamowane skróty, ponieważ możesz przejść do właściwości skrótu i ​​użyć „znajdź cel”.

W samouczkach, które widziałem, używaj wartości rejestru jako ścieżki klucza skrótu. Problem polega na tym, że używają HKCU jako roota. Gdy używany jest HKCU, a inny użytkownik odinstalowuje program (ponieważ jest on zainstalowany dla wszystkich użytkowników), klucz rejestru pozostaje. Kiedy używam HKMU jako root, pojawia się błąd ICE57, ale klucz jest usuwany, gdy inny użytkownik odinstaluje program. Wydaje się, że jestem popychany do korzystania z HKCU, chociaż wydaje się, że HKMU zachowuje się poprawnie (na użytkownika vs wszystkich użytkowników).

Kiedy próbuję utworzyć niereklamowany skrót, otrzymuję różne błędy ICE, takie jak ICE38, ICE43 lub ICE 57. Większość artykułów, które widziałem, zaleca „po prostu ignoruj ​​błędy lodu”. Musi istnieć sposób tworzenia niereklamowanych skrótów bez tworzenia błędów ICE.

Prześlij przykładowy kod działającego przykładu.

mcdon
źródło

Odpowiedzi:

113

Przepraszam, jeśli odpowiadanie na moje pytanie jest złą etykietą.

Niedawno natknąłem się na informacje o właściwości DISABLEADVTSHORTCUTS . Utworzyłem instalację z reklamowanymi skrótami i ustawiłem właściwość DISABLEADVTSHORTCUTS na 1, co powodowało tworzenie niereklamowanych skrótów. Pomija to błędy ICE43, ponieważ reklamowany skrót może używać pliku jako ścieżki klucza . Ponieważ ustawiono DISABLEADVTSHORTCUTS, Instalator Windows zastąpi te reklamowane skróty zwykłymi skrótami.

Ustawić Pakiet elementu atrybutu InstallScope do „perMachine”. To ustawia właściwość ALLUSERS do 1. Wartości ProgramMenuFolder i DesktopFolder następnie rozwiązać do profilu All Users.

W przypadku folderów utworzonych w ProgramMenuFolder istnieje element RemoveFolder i RegistryValue. Przykłady widziałem ( EX1 , EX2 ) stosowanie HKCU jako korzeń dla RegistryValue. Zmieniłem ten root na HKMU, który zamienia się na HKCU lub HKLM w zależności od wartości ALLUSERS.

Krótko mówiąc, z DISABLEADVTSHORTCUTS ustawionym na 1, Twoje reklamowane skróty nie będą powodować błędów ICE, ale zostaną przekonwertowane na niereklamowane skróty po zainstalowaniu. Wartość RegistryValue z korzeniem HKMU jest odpowiednia dla ścieżki klucza, o ile nie jest to ścieżka klucza dla niereklamowanego skrótu.

<?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>
mcdon
źródło
Naprawdę niezła robota ze szczegółami w Twojej odpowiedzi. Uważam, że jest to niezwykle pomocne, ponieważ przeglądałem dokumentację WiX i próbki. Dzięki!
Dave,
7
Świetna odpowiedź. Ale załóżmy, że mam skrót na pulpicie w oddzielnym komponencie (ponieważ instaluję go warunkowo). IIUC takich skrótów nie można reklamować. Jeśli spróbuję dodać Advertise = "tak", nawet z DISABLEADVTSHORTCUTS, pojawia się błąd CNDL0035. Czy widzisz sposób na utworzenie takiego skrótu za pomocą klucza rejestru HKMU?
marcin
9
Odpowiedź na własne pytanie nie jest wcale złą etykietą, jeśli znalazłeś dobre rozwiązanie, i jestem bardzo wdzięczny, że to zrobiłeś - i mam doskonałą odpowiedź na dodatek. +1!
fzwo
Nie odwołuj ikony do pliku wykonywalnego. Ikony są kopiowane do specjalnego katalogu (Windows \ Installer \ {GUID}), a skrót będzie używał ikony z tej lokalizacji (tj. Nie z pliku wykonywalnego w INSTALLDIR), więc lepiej jest użyć osobnego pliku ikony.
Dmitry Azaraev
Dziękuję bardzo. Spędziłem godziny na rozwiązywaniu tego. Nie mam pojęcia o DISABLEADVTSHORTCUTS.
Jason Hughes
8

Chociaż ten post jest dość stary, zawiera całkiem przydatne informacje i wygląda na nadal aktywny. Chcę zaznaczyć, że generalnie NIE potrzebujesz fikcyjnego klucza rejestru do swojego skrótu! AFAIK, to jest samouczek WiX i nie jest to MSI ani wymóg certyfikacji. Oto przykład bez klucza 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>

Zwróć uwagę, że spowoduje to umieszczenie skrótu razem z plikiem wykonywalnym w jednym komponencie. Jeśli to ci przeszkadza, użyj fikcyjnego klucza rejestru (jak w bardzo dobrze wyjaśnionej akceptowanej odpowiedzi własnej).

zzz
źródło
1
Pamiętaj, aby dodać <Property Id = "DISABLEADVTSHORTCUTS" Value = "1" /> do elementu Product
sartoris
@sartoris to należy dodać do odpowiedzi. Bez tego to nie działa.
Alex Zhukovskiy
2

Spójrz na Od MSI do WiX, część 10 - skróty Alexa Shevchuka.

Lub post na blogu Roba Menchinga Jak utworzyć skrót do odinstalowywania (i przejść wszystkie testy ICE).

Zasadniczo ICE57 jest dość denerwujący ... ale oto (wydaje się, że działa) kod, którego używam dla skrótów na pulpicie :)

<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>
saschabeaumont
źródło
9
Twój przykład używa „HKCU” jako ścieżki klucza. Jeśli jeden użytkownik zainstaluje aplikację, a inny usunie aplikację, klucz rejestru pozostanie w tyle. Pierwszy opublikowany odsyłacz używa klucza HKCU jako klucza rejestru. Drugi używa pliku jako ścieżki klucza, co powoduje błędy ICE43 i ICE57.
mcdon
1
Klucz rejestru, tak. Jednak nie sam skrót :)
saschabeaumont