Wix 为所有用户/每台机器创建非广告快捷方式

标签 wix windows-installer wix3 shortcut advertised-shortcut

在 WIX 中,如何在所有用户配置文件中创建非广告快捷方式?到目前为止,我只能通过广告中的快捷方式来完成此任务。我更喜欢非广告的快捷方式,因为您可以转到快捷方式的属性并使用“查找目标”。

在教程中,我看到使用注册表值作为快捷方式的键路径。问题是他们使用 HKCU 作为根。当使用 HKCU 时,另一个用户卸载该程序(因为它是为所有用户安装的),注册表项将被保留。当我使用 HKMU 作为 root 时,出现 ICE57 错误,但当另一个用户卸载该程序时,该 key 被删除。尽管 HKMU 似乎表现正确(每个用户与所有用户),但我似乎被迫使用 HKCU。

当我尝试创建非广告快捷方式时,我收到各种 ICE 错误,例如 ICE38、ICE43 或 ICE 57。我见过的大多数文章都建议“忽略冰错误”。必须有一种方法可以创建非广告快捷方式,而不会产生 ICE 错误。

请发布工作示例的示例代码。

最佳答案

抱歉,如果回答我自己的问题是不礼貌的。

最近我偶然发现了DISABLEADVTSHORTCUTS property的信息。我创建了一个带有广告快捷方式的安装,并将 DISABLEADVTSHORTCUTS 属性设置为 1,这会生成非广告快捷方式。这会绕过 ICE43 errors因为广告的快捷方式可以使用文件作为键路径。由于已设置 DISABLEADVTSHORTCUTS,Windows Installer 会将这些公布的快捷方式替换为常规快捷方式。

我设置了Package Element's InstallScope 属性为“perMachine”。这会将 ALLUSERS 属性设置为 1。 ProgramMenuFolder 的值和 DesktopFolder然后将解析为“所有用户”配置文件。

对于在ProgramMenuFolder 下创建的文件夹,有一个RemoveFolder 和RegistryValue 元素。我见过的示例( ex1ex2 )使用 HKCU 作为RegistryValue 的根。我将此根更改为 HKMU根据 ALLUSERS 的值解析为 HKCU 或 HKLM。

简而言之,将 DISABLEADVTSHORTCUTS 设置为 1 时,您的广告快捷方式不会产生 ICE 错误,但在安装时会转换为非广告快捷方式。具有根 HKMU 的 RegistryValue 对于 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 为所有用户/每台机器创建非广告快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2058230/

相关文章:

windows-installer - 如何从 msi 包中提取 ProductCode?

java - 如何在 Eclipse Juno 中使用 JavaFX?

wix - 如何在 Wix 中安装后运行已安装的应用程序?

wix - 如何在wix中使复选框的背景透明?

wix - 是否可以使用 wix bootstrapper 自动下载先决条件

c# - 如何在 Windows 安装程序中放置单选按钮 - 部署项目?

wix - 仅在满足某些条件时设置Wix属性

wix - 未解析对 ""部分中符号 'Fragment' 的引用

wix - 如何使用 Wix Installer 添加 JRE 的先决条件?

wix 安装程序在安装过程中重新启动