隐藏基于WiXbundle中的注册表搜索的文本



是否可以在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="ResourcesMyTheme.xml" />
  <WixVariable Id="WixExtbaThemeWxl" Value="ResourcesMyTheme.wxl" />
  <util:RegistrySearch Root="HKCU"
                       Key="SoftwareAnythingToCheck"
                       Value="Test" Variable="InstalledDotNet4" />
  <Chain>
     <MsiPackage Id="dotNETv4" DisplayName="My .NET v4 prerequisite"
                 SourceFile="myApp.msi" 
                 Visible="yes" 
                 InstallCondition="CheckboxDotNetv4" />
  </Chain>
</Wix>

我的主题.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" />

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

然后,在文件夹 Template bafunctions 下打开项目bafunctions。您需要编译此C++库并将其作为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,这样:

<util:RegistrySearch Root="HKLM"
    Key="SOFTWAREClassesInstallerProductsFCDAC0A0AD874C333A05DC1548B97920"
    Variable="InstalledDotNet4Reg" Result="exists" />

最新更新