WiX Burn:从注册表中读取 LaunchTarget

Posted

技术标签:

【中文标题】WiX Burn:从注册表中读取 LaunchTarget【英文标题】:WiX Burn: Reading LaunchTarget from Registry 【发布时间】:2014-11-11 21:37:47 【问题描述】:

我是 WiX 的新手,我正在尝试让我的 Bootstrapper 在完成后启动我已安装的应用程序。为此,我正在使用

<Variable Name="LaunchTarget" Value="path_to_exe"/>

但是,我要获得可执行文件的路径并不容易。这样做的原因是因为我使用 来安装一些先决条件,然后是一个实际安装我的 exe 的 msi。

为此,msi 将路径写入注册表中的已知位置,然后引导程序读取并使用它。

问题是引导程序读取注册表时,msi还没有运行,所以最后无法运行可执行文件。

这是我的 WiX,如果有帮助的话:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <Bundle Name="My Installation" UpgradeCode="a8964402-f3fc-4878-aafd-31ecda6b685e" Version="1.0.0.0">
        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
            <bal:WixStandardBootstrapperApplication LicenseFile="EULA.rtf"
                                                    ThemeFile="theme.xml"
                                                    SuppressOptionsUI="yes" />
        </BootstrapperApplicationRef>
        <Chain>
            <PackageGroupRef Id="NetFx40Redist"/>
            <ExePackage Id="OpenSSL" SourceFile="pre-requesite.exe" />
            <MsiPackage Id="myInstall" SourceFile="mySetup.msi" />
        </Chain>
        <util:RegistrySearch Root="HKLM"
                             Key="Software\myProgram"
                             Value="myEXEPath"
                             Variable="myEXEPath"
                             Result="value"
                             Format="raw" />
        <Variable Name="LaunchTarget" Value="[myEXEPath]"/>
    </Bundle>
</Wix>

所以,简而言之,我正在尝试让 RegistrySearch 在 MsiPackage 安装之后运行。这可以做到吗?如果没有,我有什么选择?

顺便说一句,如果我在安装前手动填写注册表值,一切正常。这意味着除了事情运行的顺序之外,一切都运行良好。

【问题讨论】:

【参考方案1】:

RegistrySearches 在检测操作期间运行。自定义 BA 可以在 Apply 之后运行 Detect,但这并不是一个真正的选择,因为您使用的是 WixStandardBootstrapperApplication。

幸运的是,WiX v3.9 添加了对运行已提升的 LaunchTarget 的支持,要求目标 .exe 的路径位于 HKLM 下的注册表中。所以你会这样做:

<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
    <bal:WixStandardBootstrapperApplication LicenseFile="EULA.rtf"
                                            ThemeFile="theme.xml"
                                            SuppressOptionsUI="yes"
                                            LaunchTargetElevatedId="MyAEEId" />
</BootstrapperApplicationRef>
<ApprovedExeForElevation Id="MyAEEId" 
                         Key="Software\myProgram" Value="myEXEPath" />

编辑:

您似乎还需要设置LaunchTarget。为什么你的捆绑包不知道它会在哪里?你可以只为LaunchTarget 输入乱码(WixStdBA 将首先尝试注册表位置),但你不能使用built-in variables 和/或MsiProperty 元素来定位exe吗?

【讨论】:

哇,我非常幸运,因为它刚刚在 12 天前发布!我升级了 WiX 并添加了两个 Elevation 东西,效果很好。非常感谢你!!!为了回答您的问题,引导程序没有路径,因为它是由 mySetup.msi 决定的。我在 msi 中设置了一个默认值,我可以将它硬编码到引导程序中,但是如果用户更改了路径,那么它将无法工作。

以上是关于WiX Burn:从注册表中读取 LaunchTarget的主要内容,如果未能解决你的问题,请参考以下文章

Wix Burn exepackage 属性

WiX Burn - 根据条件设置 InstallFolder 变量

WiX 自定义操作在 MSI 中使用 [SourceDir] 和 Burn

WIX - 在注册表中写入属性

WiX - Burn 支持两用 msi 包吗?

如何获得 Wix Burn 捆绑包以阻止升级