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

WiX扩展引导程序应用程序:如何确定选择了哪个单选按钮?,wix,bootstrapper,Wix,Bootstrapper,以下是我的设置: 在.NET 4.0上编译(这无法更改) 使用WIX3.7 使用 所以我正在创建一个bootstrapper安装项目,虽然我已经让它工作了,但我觉得有一种更干净、更简单的方法来完成它。 基本上,我需要让用户在安装产品时选择希望使用的环境。为此,我使用允许在第一个安装屏幕上放置一些单选按钮。 所有设置都很好,但后来我意识到我不知道如何轻松地确定选择了哪个单选按钮。因此,在我处理这些问题时,我只是在捆绑包中列出了MSI三次,并对每一次列出安装条件。 是否有办法确定只使

以下是我的设置:

  • 在.NET 4.0上编译(这无法更改)
  • 使用WIX3.7
  • 使用
所以我正在创建一个bootstrapper安装项目,虽然我已经让它工作了,但我觉得有一种更干净、更简单的方法来完成它。

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

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

是否有办法确定只使用一个属性选择了哪个单选按钮?(例如,当我将
InstallFolder
属性传递给我的MSI时,如下面的代码所示。)如果目前没有办法这样做,有没有一种方法可以让我在不向捆绑包中添加三次MSI的情况下做到这一点?

下面是我的代码(注意我是如何将基本相同的
MsiPackage
列出三次的):


我也在项目的CodePlex站点上问了这个问题,开发人员回答如下(这里是完整讨论的链接:):

现在可以使用自定义操作功能完成此操作。

我测试了他的反应,发现是正确的!此功能在版本中可用。本手册中还包括一个示例,演示了如何实现这一点。我已在下面发布了相关代码:

自定义动作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中需要(来自):


查看文本中的链接,获取这些代码示例的原始示例。希望这对以后的其他人有帮助

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.");
  }
  ...
<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>