在WiX Bundle中隐藏基于RegistrySearch的文本

时间:2013-09-12 16:10:57

标签: wix burn

是否可以在WiX套餐中使用RegistrySearch隐藏主题中的Text? 我不知道从哪里开始。在下面的代码中,InstalledDotNet4变量未将Text及时设置为禁用,我找不到禁用Text(或更改其文本内容)的方法。

Bundle.wxs:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
  <Bundle Name="My App" Version="1.0.0.0"
          Manufacturer="ACME"
          UpgradeCode="d88faa97-2197-4154-9e77-32f9ca773bd4">

  <BootstrapperApplicationRef
    Id="WixExtendedBootstrapperApplication.HyperlinkLicense">

    <Payload SourceFile="Resources/background.png" Id="myLogo" />

  </BootstrapperApplicationRef>

  <WixVariable Id="WixExtbaLicenseUrl" Value="" />
  <WixVariable Id="WixExtbaThemeXml" Value="Resources\MyTheme.xml" />
  <WixVariable Id="WixExtbaThemeWxl" Value="Resources\MyTheme.wxl" />

  <util:RegistrySearch Root="HKCU"
                       Key="Software\AnythingToCheck"
                       Value="Test" Variable="InstalledDotNet4" />

  <Chain>
     <MsiPackage Id="dotNETv4" DisplayName="My .NET v4 prerequisite"
                 SourceFile="myApp.msi" 
                 Visible="yes" 
                 InstallCondition="CheckboxDotNetv4" />
  </Chain>
</Wix>

MyTheme.xml:

<?xml version="1.0" encoding="utf-8"?>
<Theme xmlns="http://wixtoolset.org/schemas/thmutil/2010">
  <!-- Window definition -->
  <!-- Font definition -->

  <Page Name="Install">
    <Checkbox Name="CheckboxDotNet4"
              X="205" Y="126"
              Width="-100" Height="17"
              TabStop="yes" FontId="3"
              HideWhenDisabled="yes">.NET Framework 4.0</Checkbox>
    <Text Name="InstalledDotNet4"
          X="-10" Y="126"
          Width="80" Height="17"
          TabStop="no" FontId="3"
          HideWhenDisabled="yes">(Installed)</Text>
  </Page>

  <!-- More pages -->
</Theme>

此外,我尝试在Bundle.wxs中使用以下代码,但这与RegistrySearch没有关联:

<Variable Name="InstalledDotNet4State" Type="string" Value="disable" />

1 个答案:

答案 0 :(得分:3)

是的,经过广泛研究后,我发现可以隐藏基于Text的{​​{1}}。首先,您需要从http://wixextba.codeplex.com/下载 WiX扩展引导程序应用程序。提取内容并将RegistrySearch添加到项目中,如WixBalExtensionExt.dll示例中所示。

然后,在文件夹Bundle10.wxs下打开项目bafunctions。您需要编译此C ++库并将其作为Template bafunctions添加到您的包中(以Payload为例)。

然后,为了能够阅读和隐藏Bundle10.wxs控件,取消注释函数Text并添加以下代码,例如:

OnDetectComplete()

最后,以这种方式更改(或添加)STDMETHODIMP OnDetectComplete() { HRESULT hr = S_OK; LPWSTR sczValue = NULL; #if DEBUG // Show log info during debug. // May not be THE way to log. size_t i; LPSTR sczValue2 = (char *) malloc(100); #endif BalGetStringVariable(L"InstalledDotNet4Reg", &sczValue); BalExitOnFailure(hr, "Failed to get variable."); if (sczValue == NULL) { BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Failed to read null variable."); } else { if (_wtoi(sczValue)) { hr = m_pEngine->SetVariableString(L"CheckboxDotNetv4State", L"disable"); BalExitOnFailure(hr, "Failed to set control state."); hr = m_pEngine->SetVariableNumeric(L"CheckboxDotNetv4", 0); BalExitOnFailure(hr, "Failed to set variable."); } else { #if DEBUG // Log information wcstombs_s(&i, sczValue2, (size_t)100, sczValue, (size_t)100); BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, sczValue2); #endif hr = m_pEngine->SetVariableString(L"InstalledDotNet4State", L"disable"); BalExitOnFailure(hr, "Failed to set control state."); } } LExit: ReleaseStr(sczValue); return hr; }

RegistrySearch