2010-01-13 38 views
69

Trong WIX, làm thế nào để bạn tạo lối tắt không được quảng cáo trong cấu hình allusers? Cho đến nay tôi chỉ có thể thực hiện điều này bằng các phím tắt được quảng cáo. Tôi thích các phím tắt không được quảng cáo vì bạn có thể đi đến thuộc tính của phím tắt và sử dụng "tìm mục tiêu".Wix tạo lối tắt không được quảng cáo cho tất cả người dùng/mỗi máy

Trong hướng dẫn tôi đã thấy sử dụng giá trị đăng ký cho đường phím của lối tắt. Vấn đề là họ sử dụng HKCU làm gốc. Khi HKCU được sử dụng, và một người dùng khác gỡ cài đặt chương trình (vì nó được cài đặt cho tất cả người dùng), khóa đăng ký bị bỏ lại phía sau. Khi tôi sử dụng HKMU làm gốc, tôi nhận được lỗi ICE57, nhưng khóa sẽ bị xóa khi người dùng khác gỡ cài đặt chương trình. Tôi dường như bị đẩy theo hướng sử dụng HKCU mặc dù HKMU có vẻ hoạt động chính xác (mỗi người dùng so với tất cả người dùng).

Khi cố gắng tạo lối tắt không được quảng cáo, tôi nhận được nhiều lỗi ICE khác nhau như ICE38, ICE43 hoặc ICE 57. Hầu hết các bài viết tôi đã đề xuất "chỉ bỏ qua lỗi băng". Phải có cách để tạo các lối tắt không được quảng cáo, mà không tạo lỗi ICE.

Vui lòng gửi mã mẫu để làm ví dụ.

Trả lời

101

Xin lỗi nếu đó là nghi thức xấu để trả lời câu hỏi của riêng tôi.

Gần đây tôi đã tình cờ gặp thông tin trên DISABLEADVTSHORTCUTS property. Tôi đã tạo cài đặt với các phím tắt được quảng cáo và đặt thuộc tính DISABLEADVTSHORTCUTS thành 1 tạo ra các lối tắt không được quảng cáo. Điều này bỏ qua ICE43 errors vì lối tắt được quảng cáo có thể sử dụng tệp dưới dạng đường phím. Vì DISABLEADVTSHORTCUTS đã được thiết lập, Windows Installer sẽ thay thế các lối tắt được quảng cáo này bằng các phím tắt thông thường.

Tôi đặt thuộc tính InstallScope thành "perMachine" Package Element's InstallScope. Điều này đặt thuộc tính ALLUSERS thành 1. Giá trị của ProgramMenuFolderDesktopFolder sau đó sẽ giải quyết thành cấu hình Tất cả người dùng.

Đối với các thư mục được tạo trong ProgramMenuFolder, có phần tử RemoveFolder và RegistryValue. Các ví dụ tôi đã thấy (ex1, ex2) sử dụng HKCU làm gốc cho RegistryValue. Tôi đã thay đổi thư mục gốc này thành HKMU để chuyển thành HKCU hoặc HKLM tùy thuộc vào giá trị của ALLUSERS.

Tóm lại, với DISABLEADVTSHORTCUTS được đặt thành 1 lối tắt được quảng cáo của bạn sẽ không tạo lỗi ICE, nhưng sẽ được chuyển thành phím tắt không được quảng cáo khi được cài đặt. Một RegistryValue với root HKMU là tốt cho một KeyPath miễn là nó không phải là keypath cho một shortcut không được quảng cáo.

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

Công việc thực sự tuyệt vời với các chi tiết trong câu trả lời của bạn. Tôi thấy điều này cực kỳ hữu ích vì tôi đã lướt qua tài liệu và mẫu WiX. Cảm ơn! – Dave

+6

Câu trả lời hay. Nhưng giả sử tôi có một lối tắt trên màn hình trong một thành phần riêng biệt (vì tôi cài đặt nó theo điều kiện). Các lối tắt như vậy không thể được quảng cáo. Nếu tôi cố gắng thêm Quảng cáo = "có" ngay cả với DISABLEADVTSHORTCUTS, tôi gặp lỗi CNDL0035. Bạn có thể thấy một cách để thực hiện lối tắt như vậy với khóa sổ đăng ký HKMU không? – marcin

+8

Trả lời câu hỏi của riêng bạn không phải là nghi thức xấu nếu bạn đã tìm thấy một giải pháp tốt, và tôi rất biết ơn bạn đã làm - và với một câu trả lời tuyệt vời để khởi động. +1! – fzwo

2

Hãy xem From MSI to WiX, Part 10 - Shortcuts bởi Alex Shevchuk.

Hoặc bài đăng blog Rob Menching của How to create an uninstall shortcut (and pass all the ICE validation).

Về cơ bản ICE57 là khá khó chịu ... nhưng đây là (có vẻ như được làm việc) mã Tôi đang sử dụng cho shortcut trên desktop :)

<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

Ví dụ của bạn sử dụng "HKCU" làm đường phím. Nếu một người dùng cài đặt ứng dụng và một người dùng khác xóa ứng dụng thì khóa đăng ký sẽ vẫn ở lại. Liên kết đầu tiên được đăng sử dụng HKCU cho khóa đăng ký. Thứ hai sử dụng một tập tin như là keypath trong đó sản xuất lỗi ICE43 và ICE57. – mcdon

+1

Khoá đăng ký, vâng. Tuy nhiên, không phải phím tắt đó :) – saschabeaumont

3

Mặc dù bài đăng này khá cũ chứa thông tin khá hữu ích và trông vẫn hoạt động. Tôi muốn chỉ ra rằng nói chung bạn không cần một khóa registry giả cho shortcut của bạn! AFAIK đây là hướng dẫn sử dụng WiX và không phải là MSI hoặc yêu cầu chứng nhận. Dưới đây là một ví dụ không có chìa khóa 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> 

Lưu ý rằng điều này sẽ đưa shortcut của bạn cùng với các thực thi trong một thành phần.Nếu điều này làm phiền bạn sau đó sử dụng khóa registry giả (như trong câu trả lời tự chấp nhận rất tốt).

+0

Hãy nhớ thêm vào phần tử Product – sartoris

Các vấn đề liên quan