2013-09-12 2 views
2

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

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" /> 
+0

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

ответ

3

Да, после обширных исследований я обнаружил, что можно скрыть 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" /> 
+0

Я не понимаю, что вы сделали. Как InstalledDotNet4State скрывает ваш текст? – Jippers

+1

@Jippers, если я правильно понимаю ваш вопрос, «InstallDotNet4State» скрывает текст, потому что имя переменной (без состояния) сопоставляется с элементом управления «InstallDotNet4». Тогда, если я установил его значение «отключить», тогда элемент управления с таким же именем будет невидимым (отключено). Например, вы можете назвать свой элемент управления «MyControl», а в C++ - установить переменную MyControlState на «disable», поэтому элемент управления будет в конечном счете отключен. – Marlos

+0

Спасибо, Марлос. Я нашел через множество (un) документацию о том, как переменная * Состояние автоматически сопоставляется с именем управления *. – Jippers

Смежные вопросы