WiX扩展引导程序应用程序:如何确定选择哪个单选按钮?

时间:2013-02-07 00:39:41

标签: wix bootstrapper

这是我的设置:

所以我正在创建一个bootstrapper安装项目,虽然我已经开始工作,但我觉得有一个更干净,更简单的方法。

基本上,我需要让用户在安装产品时选择他们希望使用的环境。为此,我使用WiX Extended Bootstrapper Application extension允许我在第一个安装屏幕上放置一些单选按钮。

得到所有设置都很好,但后来我意识到我不知道如何轻松确定选择了哪个单选按钮。因此,当我解决这个问题时,我只是在捆绑包中列出了三次MSI并在每个上面安装了安装条件。

有没有办法确定只用一个属性选择了哪个单选按钮?(例如,当我将InstallFolder属性传递给我的MSI时,如下面的代码所示。)< strong>如果目前还没有办法做到这一点,有没有办法让我这样做而不将我的MSI三次添加到捆绑包中?

这是我的代码(注意我基本上列出了相同的MsiPackage三次):

<?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">
  <?include Properties.wxi ?>

  <Bundle Name="!(loc.Product.Name)" Version="$(var.Version)" Manufacturer="!(loc.Product.Manufacturer)" UpgradeCode="$(var.UpgradeCode)" Condition="VersionNT >= v5.1">
    <BootstrapperApplicationRef Id="WixExtendedBootstrapperApplication.Hyperlink2License">
      <bal:WixExtendedBootstrapperApplication SuppressRepair="yes" LicenseUrl="" ThemeFile="$(var.Bundle.ExtTheme.RadioBtns.Path)" LocalizationFile="$(var.Bundle.ExtTheme.RadioBtns.l10n.Path)" />
    </BootstrapperApplicationRef>

    <WixVariable Id="WixMbaPrereqPackageId" Value="Netfx4Full" />

    <Variable Name="InstallFolder" Type="string" Value="$(var.InstallFolder.Value)" />

    <Variable Name="RadioButton1" Type="numeric" Value="0" />
    <Variable Name="RadioButton2" Type="numeric" Value="0" />
    <Variable Name="RadioButton3" Type="numeric" Value="1" />

    <Chain>
      <!-- Other Package References Here -->

      <MsiPackage Id="DBConnections_Dev"
                  SourceFile="$(var.MSI.Path)"
                  Visible="no"
                  Vital="yes"
                  InstallCondition="RadioButton1 = 1">
        <MsiProperty Name="INSTALLFOLDER" Value="[InstallFolder]" />
        <MsiProperty Name="SELECTED_ENV" Value="1" />
      </MsiPackage>
      <MsiPackage Id="DBConnections_Stage"
                  SourceFile="$(var.MSI.Path)"
                  Visible="no"
                  Vital="yes"
                  InstallCondition="RadioButton2 = 1">
        <MsiProperty Name="INSTALLFOLDER" Value="[InstallFolder]" />
        <MsiProperty Name="SELECTED_ENV" Value="2" />
      </MsiPackage>
      <MsiPackage Id="DBConnections_Prod"
                  SourceFile="$(var.MSI.Path)"
                  Visible="no"
                  Vital="yes"
                  InstallCondition="RadioButton3 = 1">
        <MsiProperty Name="INSTALLFOLDER" Value="[InstallFolder]" />
        <MsiProperty Name="SELECTED_ENV" Value="3" />
      </MsiPackage>
    </Chain>
  </Bundle>
</Wix>

1 个答案:

答案 0 :(得分:1)

我还在项目的CodePlex网站上提出了这个问题,开发人员回复如下(这里是完整讨论的链接:http://wixextba.codeplex.com/discussions/432341):

This can now be done using the custom actions feature.

我测试了他的回答并发现它是正确的!从版本3.7.4791.32058开始提供此功能。 source code中还包含一个示例,演示如何完成此操作。我在下面发布了相关代码:

自定义操作c ++代码中需要:

STDMETHODIMP OnPlanCustomAction()
{
  ...
  if (SUCCEEDED(BalGetNumericVariable(L"RadioButton1", &llValue)) && llValue)
  {
    m_pEngine->SetVariableNumeric(L"RadioButton", 1);
    BalExitOnFailure(hr, "Failed to set variable.");
  }
  else if (SUCCEEDED(BalGetNumericVariable(L"RadioButton2", &llValue)) && llValue)
  {
    m_pEngine->SetVariableNumeric(L"RadioButton", 2);
    BalExitOnFailure(hr, "Failed to set variable.");
  }
  else if (SUCCEEDED(BalGetNumericVariable(L"RadioButton3", &llValue)) && llValue)
  {
    m_pEngine->SetVariableNumeric(L"RadioButton", 3);
    BalExitOnFailure(hr, "Failed to set variable.");
  }
  else if (SUCCEEDED(BalGetNumericVariable(L"RadioButton4", &llValue)) && llValue)
  {
    m_pEngine->SetVariableNumeric(L"RadioButton", 4);
    BalExitOnFailure(hr, "Failed to set variable.");
  }
  else
  {
    m_pEngine->SetVariableNumeric(L"RadioButton", 0);
    BalExitOnFailure(hr, "Failed to set variable.");
  }
  ...


需要WiX XML(来自examples that come with downloaded DLL):

<Variable Name="RadioButton1" Type="numeric" Value="0" />
<Variable Name="RadioButton2" Type="numeric" Value="1" />
<Variable Name="RadioButton3" Type="numeric" Value="0" />
<Variable Name="RadioButton4" Type="numeric" Value="0" />

<Chain DisableSystemRestore="yes">
  <PackageGroupRef Id="NetFx40Redist" />
  <MsiPackage
    Id="Setup"
    Compressed="yes"
    SourceFile="Setup.msi"
    Vital="yes">
    <MsiProperty Name="APPLICATIONFOLDER" Value="[InstallFolder]" />
    <MsiProperty Name="RadioButton" Value="[RadioButton]" />
  </MsiPackage>
</Chain>

查看文本中的链接,了解从中获取这些代码示例的原始示例。希望这有助于将来的其他人。