2010-01-13 16 views
69

W WIX, w jaki sposób utworzyć nie reklamowany skrót w profilu użytkownika? Do tej pory udało mi się to osiągnąć jedynie dzięki reklamowanym skrótom. Wolę nie reklamowane skróty, ponieważ możesz przejść do właściwości skrótu i ​​użyć "znajdź miejsce docelowe".Wix utworzyć niezgłaszany skrót dla wszystkich użytkowników/na maszynę

W samouczkach, które widziałem, użyj wartości rejestru dla klawisza skrótu. Problem polega na tym, że używają HKCU jako root. Gdy używany jest HKCU, a inny użytkownik odinstalowuje program (ponieważ jest on instalowany dla wszystkich użytkowników), klucz rejestru pozostaje w tyle. Kiedy używam HKMU jako root, otrzymuję błąd ICE57, ale klucz jest usuwany, gdy inny użytkownik odinstalowuje program. Wydaje mi się, że jestem zmuszony do używania HKCU, chociaż wydaje mi się, że HKMU zachowuje się poprawnie (dla każdego użytkownika w stosunku do wszystkich użytkowników).

Kiedy próbuję utworzyć non reklamowane skrót uzyskać różne błąd ICE takich jak ICE38, ICE43 lub ICE 57. Większość artykułów widziałem polecam „po prostu zignorować błędy lodu”. Musi istnieć sposób tworzenia nie reklamowanych skrótów, bez tworzenia błędów ICE.

Proszę wstawić przykładowy kod do przykładu roboczego.

Odpowiedz

101

Przepraszam, jeśli to zła etykieta, aby odpowiedzieć na moje własne pytanie.

Ostatnio natknąłem się na informacje na DISABLEADVTSHORTCUTS property. Utworzyłem instalację z reklamowanymi skrótami i ustawiłem właściwość DISABLEADVTSHORTCUTS na 1, która generowała nie reklamowane skróty. Pomija to ICE43 errors, ponieważ reklamowany skrót może wykorzystywać plik jako keypath. Ponieważ ustawiono DISABLEADVTSHORTCUTS, Instalator Windows zastąpi te reklamowane skróty zwykłymi skrótami.

Ustawiam atrybut InstallScope Package Element's na "perMachine". Spowoduje to ustawienie właściwości ALLUSERS na 1. Wartości ProgramMenuFolder i DesktopFolder zostaną następnie przekształcone w profil Wszyscy użytkownicy.

Dla folderów utworzonych w folderze ProgramMenuFolder znajduje się element RemoveFolder i RegistryValue. Przykłady, które widziałem (ex1, ex2) używają HKCU jako katalogu głównego dla wartości RegistryValue. Zmieniłem ten root na HKMU, który rozróżnia się na HKCU lub HKLM w zależności od wartości ALLUSERS.

W skrócie, przy ustawieniu DISABLEADVTSHORTCUTS na 1 Twoje reklamowane skróty nie będą generować błędów ICE, ale zostaną przekonwertowane na nie reklamowane skróty po zainstalowaniu. Wartość rejestru z root HKMU jest dobra dla ścieżki KeyPath, o ile nie jest keypath dla nie reklamowanego 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> 
+0

Naprawdę miła praca ze szczegółami w Twojej odpowiedzi. Znalazłem to niezwykle pomocne, ponieważ brałem udział w dokumentacji i próbkach WiX. Dzięki! – Dave

+6

Świetna odpowiedź. Ale przypuśćmy, że mam skrót na pulpicie w osobnym komponencie (ponieważ instaluję go warunkowo). IIUC takich skrótów nie można reklamować. Jeśli spróbuję dodać Advertise = "yes" nawet przy użyciu DISABLEADVTSHORTCUTS, pojawia się błąd CNDL0035. Czy widzisz sposób na uzyskanie takiego skrótu za pomocą klucza rejestru HKMU? – marcin

+8

Udzielenie odpowiedzi na własne pytanie nie jest złą etykietą, jeśli znalazłeś dobre rozwiązanie i jestem ci bardzo wdzięczny - i doskonałą odpowiedzią na start. +1! – fzwo

2

Spójrz na From MSI to WiX, Part 10 - Shortcuts autorstwa Alexa Szewczuka.

Albo Rob Menching na blogu How to create an uninstall shortcut (and pass all the ICE validation).

Zasadniczo ICE57 jest raczej irytujące ... ale tutaj jest (wydaje się działać) Kod używam na pulpicie skróty :)

<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> 
+7

Twój przykład używa "HKCU" jako keypath. Jeśli jeden użytkownik zainstaluje aplikację, a inny użytkownik usunie aplikację, klucz rejestru pozostanie w tyle. Pierwszy opublikowany link używa klucza HKCU dla klucza rejestru. Drugi używa pliku jako klawisza, który generuje błędy ICE43 i ICE57. – mcdon

+1

Klucz rejestru, tak. Ale nie sam skrót :) – saschabeaumont

3

Chociaż ten post jest raczej stary zawiera bardzo przydatne informacje i wygląda nadal aktywne. Chcę zauważyć, że generalnie NIE potrzebujesz fikcyjnego klucza rejestru dla swojego skrótu! AFAIK jest to tutorial typu WiX i nie jest wymogiem MSI ani certyfikacji. Oto przykład bez klucza rejestru:

<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> 

Pamiętaj, że spowoduje to dodanie skrótu do pliku wykonywalnego w jednym komponencie.Jeśli ci to przeszkadza, użyj atrapowego klucza rejestru (tak jak w dobrze wyjaśnionej, zaakceptowanej odpowiedzi własnej).

+0

Pamiętaj, aby dodać do elementu produktu – sartoris

Powiązane problemy