Скрыть текст на основе RegistrySearch в WiX Bundle

Можно ли использовать пакет RegistrySearch в WiX, чтобы скрыть Text в теме? Я понятия не имею, с чего начать. В приведенном ниже коде переменная InstalledDotNet4 не отключает Text вовремя, и я не могу найти способ отключить Text (или изменить его текстовое содержимое).

Комплект.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" />

person Marlos    schedule 12.09.2013    source источник
comment
Я добавил свой собственный ответ, но честно и вежливо, я не буду отмечать свой вопрос как отвеченный в течение 24 часов, на случай, если у кого-то есть лучший ответ.   -  person Marlos    schedule 17.09.2013


Ответы (1)


Да, после обширных исследований я обнаружил, что можно скрыть Text на основе RegistrySearch. Сначала вам нужно загрузить приложение WiX Extended Bootstrapper с http://wixextba.codeplex.com/ . Извлеките содержимое и добавьте в свой проект WixBalExtensionExt.dll, как показано в примере Bundle10.wxs.

Затем откройте проект bafunctions в папке Template 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="SOFTWARE\Classes\Installer\Products\FCDAC0A0AD874C333A05DC1548B97920"
    Variable="InstalledDotNet4Reg" Result="exists" />
person Marlos    schedule 17.09.2013
comment
Я не понимаю, что ты сделал. Как InstalledDotNet4State скрывает ваш текст? - person Jippers; 02.04.2014
comment
@Jippers, если я правильно понимаю ваш вопрос, «InstallDotNet4State» скрывает текст, потому что имя переменной (без состояния) сопоставляется с элементом управления «InstallDotNet4». Затем, если я установлю его значение «отключить», тогда элемент управления с тем же корневым именем будет невидимым (отключен). Например, вы можете назвать свой элемент управления «MyControl» и в коде C++ установить для переменной «MyControlState» значение «disable», поэтому элемент управления в конечном итоге будет отключен. - person Marlos; 02.04.2014
comment
Спасибо, Марлос. Я обнаружил во множестве (не)документации, как переменная *State автоматически сопоставляется с * именем элемента управления. - person Jippers; 03.04.2014
comment
протестировал решение. Он скрывает текстовое поле независимо от результата поиска в реестре. Раздел реестра существует или нет, текстовое поле будет скрыто. - person Thracian; 06.11.2014
comment
Спасибо за этот совет. Быстрый вопрос: есть ли другие волшебные слова, о которых мы должны знать? отключить, невидимый, серый, и тому подобное. - person Alex; 20.10.2015
comment
@ Алекс Я не думаю, что есть другие волшебные слова. В исходном коде, в папке wixstdba, есть файл с именем WixStandardBoostrapperApplication.cpp. Слово «состояние» используется там, в методе OnChangeState. - person Marlos; 21.10.2015
comment
@Marlos Я делаю то, что вы упомянули, и у меня это работает, так что спасибо за это. Но есть пара вопросов по этому поводу - 1. Мне нужно удалить ссылку на WixBalExtension, чтобы добавить WixBalExtensionExt. Это нормально? 2. Нужно ли мне что-либо менять в определении пространства имен, поскольку его создание, хотя и успешное, выдает мне сообщения в VS2012, например: «Не удалось найти информацию о схеме для элемента WixExtendedBootstrapperApplication и не удалось найти информацию о схеме для атрибута LicenseFile/LocalizationFile и т. д. - person randomuser15995183; 05.05.2016