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


81

Trong WIX, làm cách nào để bạn tạo lối tắt không được quảng cáo trong hồ sơ người dùng? Cho đến nay, tôi chỉ có thể thực hiện điều này với 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 hơn vì bạn có thể đi đến các thuộc tính của phím tắt và sử dụng "tìm mục tiêu".

Trong các hướng dẫn tôi đã thấy sử dụng giá trị đăng ký cho đường dẫn phím của một phím tắt. Vấn đề là họ sử dụng HKCU làm gốc. Khi HKCU được sử dụng và 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ý sẽ bị bỏ lại. Khi tôi sử dụng HKMU làm gốc, tôi gặp 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ị thúc đẩy sử dụng HKCU mặc dù HKMU dường như hoạt động chính xác (mỗi người dùng so với tất cả người dùng).

Khi tôi cố gắng tạo lối tắt không được quảng cáo, tôi gặp nhiều lỗi ICE khác nhau, chẳng hạn như ICE38, ICE43 hoặc ICE 57. Hầu hết các bài báo tôi đã xem đều khuyên "chỉ cần bỏ qua lỗi băng". Phải có một cách để tạo các phím tắt không được quảng cáo, mà không tạo ra lỗi ICE.

Vui lòng đăng mã mẫu cho một ví dụ làm việc.

Câu trả lời:


113

Xin lỗi nếu đó là một 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ờ biết được thông tin về tài sản DISABLEADVTSHORTCUTS . Tôi đã tạo một bản 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 phím tắt không được quảng cáo. Điều này bỏ qua lỗi ICE43 vì lối tắt được quảng cáo có thể sử dụng tệp làm đường dẫn phím. Bởi vì DISABLEADVTSHORTCUTS đã được thiết lập, Windows Installer sẽ thay thế các phím 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 của Phần tử gói thành "perMachine". Bộ này là tài sản AllUsers đến 1. Giá trị của ProgramMenuFolderDesktopFolder sau đó sẽ giải quyết cho tất cả người dùng profile.

Đố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 gốc này thành HKMU , phân giải 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, các phím tắt được quảng cáo của bạn sẽ không tạo ra lỗi ICE, nhưng sẽ được chuyển đổi thành các phím tắt không được quảng cáo khi được cài đặt. Một RegistryValue với HKMU gốc là tốt cho một KeyPath miễn là nó không phải là đường dẫn phím cho một lối tắt 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>

Công việc thực sự tốt 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 đã xem qua tài liệu và mẫu của WiX. Cảm ơn!
Dave

7
Câu trả lời chính xác. Nhưng giả sử tôi có một phím 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ó có điều kiện). IIUC các phím tắt như vậy không thể được quảng cáo. Nếu tôi cố gắng thêm Advertise = "yes" ngay cả với DISABLEADVTSHORTCUTS, tôi gặp lỗi CNDL0035. Bạn có thể xem cách tạo phím tắt như vậy với khóa đăng ký HKMU không?
marcin

9
Trả lời câu hỏi của chính bạn không phải là một nghi thức tồi 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

Không tham chiếu biểu tượng đến tệp thực thi. Các biểu tượng được sao chép trong thư mục đặc biệt (Windows \ Installer \ {GUID}) và phím tắt sẽ sử dụng biểu tượng từ vị trí này (tức là không phải từ tệp thực thi trong INSTALLDIR), vì vậy tốt hơn là sử dụng tệp biểu tượng riêng biệt.
Dmitry Azaraev

Cảm ơn bạn rất nhiều. Tôi đã dành hàng giờ khắc phục sự cố này. Không có manh mối nào về DISABLEADVTSHORTCUTS.
Jason Hughes

8

Mặc dù bài đăng này đã khá cũ nhưng nó chứa thông tin khá hữu ích và trông vẫn còn hoạt động. Tôi muốn chỉ ra rằng nói chung bạn KHÔNG cần khóa đăng ký giả cho phím tắt của mình! AFAIK đây là hướng dẫn WiX đơn giản và không phải là MSI hoặc yêu cầu chứng nhận. Đây là một ví dụ không có 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ẽ đặt phím tắt của bạn cùng với tệp thực thi trong một thành phần. Nếu điều này làm phiền bạn thì hãy sử dụng khóa đăng ký giả (như trong câu trả lời tự chấp nhận được giải thích rất rõ ràng).


1
Hãy nhớ thêm <Property Id = "DISABLEADVTSHORTCUTS" Value = "1" /> vào phần tử Sản phẩm
sartoris vào

@sartoris cái này nên được thêm vào câu trả lời. Không có nó, nó không hoạt động.
Alex Zhukovskiy

2

Hãy xem Từ MSI đến WiX, Phần 10 - Các phím tắt của Alex Shevchuk.

Hoặc bài đăng trên blog của Rob Menching Cách tạo lối tắt gỡ cài đặt (và vượt qua tất cả các xác nhận ICE).

Về cơ bản ICE57 khá khó chịu ... nhưng đây là mã (dường như đang hoạt động) mà tôi đang sử dụng cho các phím tắt trên Máy tính để bàn :)

<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
Ví dụ của bạn sử dụng "HKCU" làm đường dẫn khóa. 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, 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 làm đường dẫn phím tạo ra lỗi ICE43 và ICE57.
mcdon

1
Khóa đăng ký, có. Không phải là phím tắt riêng của mình tuy nhiên :)
saschabeaumont
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.