Как установить функции в зависимости от стоимости имущества - PullRequest
6 голосов
/ 26 сентября 2011

У меня есть раздел реестра, который может быть равен одному из двух значений: специальное значение или null .И две особенности.

Когда мой раздел реестра равен специальному значению , установщик должен установить первую функцию.если раздел реестра не найден при поиске в реестре, установщик должен установить вторую функцию.И если ключ реестра имеет значение null , программа установки не должна устанавливать ни одну из этих двух функций.

Что я делаю или неправильно понимаю?Если INSTALLLEVEL = 5, SPECIALVALUE = "special", MYTREAT = "1", должна быть установлена ​​первая функция, но установщик не устанавливает обе функции в этом случае.

<Feature Id="MyFeatures" Level="1" ConfigurableDirectory='INSTALLLOCATION' Display='expand' AllowAdvertise='no'>

  <ComponentRef Id='Empty'/>

  <Feature Id='First' Level='3' AllowAdvertise='no' ConfigurableDirectory='INSTALLLOCATION'>
    <Condition Level="0">INSTALLLEVEL=4 OR (MYTREAT="1" AND NOT SPECIALVALUE AND NOT SPECIALVALUE="")</Condition>
    <Condition Level="1">SPECIALVALUE="special" AND MYTREAT="1"</Condition>
    <ComponentRef Id="first_comp"/>                 
  </Feature>

  <Feature Id="Second" Level="4" AllowAdvertise="no" ConfigurableDirectory="INSTALLLOCATION">
    <Condition Level="0">INSTALLLEVEL=3 OR (MYTREAT="1" AND SPECIALVALUE)</Condition>
    <ComponentRef Id="second_comp"/>
  </Feature>

</Feature>

Я изменилмой код, но он все еще не работает правильно.Проблема с условиями.В ключе реестра есть специальное значение, но программа установки все еще пропускает первую функцию.Я обнаружил, что условие только с «MYTREAT = 1» не работает.Но в логах клиентская сторона отправляет на сервер свойство MYTREAT с этим значением. INSTALLLEVEL равно 1. Свойство MYTREAT инициализируется с помощью кнопки управления, может быть, здесь моя проблема?Вот новый код:

     <Feature Id="Myfeatures" Level="3"
            ConfigurableDirectory='INSTALLLOCATION'
            Display='expand' AllowAdvertise='no'>
                <Condition Level='1'>MYTREAT="1"</Condition>
                <ComponentRef Id='Empty'/>
                <Feature Id='First' Level='3' AllowAdvertise='no'
                    ConfigurableDirectory='INSTALLLOCATION'> <!--Must be installed by default,default value of INSTALLLEVEL is 3-->
                        <Condition Level="1">MYTREAT="1" AND SPECIALVALUE="SPECIAL"</Condition>
                        <ComponentRef Id="first_comp"/>                 
                </Feature>
                <Feature Id="Second" Level="10" AllowAdvertise="no"
                    ConfigurableDirectory="INSTALLLOCATION"><!---->
                            <Condition Level="1">(MYTREAT="1" AND NOT SPECIALVALUE)</Condition>
                            <ComponentRef Id="second_comp"/>                    
                </Feature>
        </Feature>

                     ............
<Dialog Id="TreatDlg" Width="260" Height="85">    
<Control Id="Mytreat" Type="PushButton" X="50" Y="57" Width="56" Height="17" Property="MYTREAT">
       <Publish Property="MYTREAT" Value="1">1</Publish>
       <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
    </Control>

PS Я инициализировал MYTREAT с 1 по умолчанию, и условие было оценено правильно.Почему я не могу использовать свойство элемента управления в состоянии функции?И как решить мою проблему! Пожалуйста, помогите!

1 Ответ

10 голосов
/ 26 сентября 2011

Распространенной ошибкой является попытка управления функциями через свойство INSTALLLEVEL.Уровень установки должен быть статическим, его не следует изменять во время установки.

Значение INSTALLLEVEL считается уровнем, выше которого функции больше не устанавливаются.Например, если INSTALLLEVEL = 5, будет установлена ​​функция с уровнем 4, а функция с уровнем 6 не будет установлена.

С помощью INSTALLLEVEL вы можете управлять исходным состоянием функции, например:

<Feature Id="MyFeatures" Level="4" ConfigurableDirectory='INSTALLLOCATION' Display='expand' AllowAdvertise='no'>

  <!-- Feature is not installed by default -->
  <Feature Id='First' Level='6' AllowAdvertise='no' ConfigurableDirectory='INSTALLLOCATION'/>

  <!-- Feature is installed by default -->
  <Feature Id="Second" Level="4" AllowAdvertise="no" ConfigurableDirectory="INSTALLLOCATION"/>    

</Feature>

Для вышеуказанной конфигурации вы можете затем добавить условия установки, установив уровень ниже или выше, чем INSTALLLEVEL:

<Feature Id="MyFeatures" Level="4" ConfigurableDirectory='INSTALLLOCATION' Display='expand' AllowAdvertise='no'>

  <Feature Id='First' Level='6' AllowAdvertise='no' ConfigurableDirectory='INSTALLLOCATION'>
    <Condition Level="4">(MYTREAT="1") AND (SPECIALVALUE="special")</Condition>         
  </Feature>

  <Feature Id="Second" Level="4" AllowAdvertise="no" ConfigurableDirectory="INSTALLLOCATION">
    <Condition Level="6">(INSTALLLEVEL = 3) OR (MYTREAT="1" AND SPECIALVALUE)</Condition>
  </Feature>

</Feature>

Как видите, атрибуты уровня функции вращаются вокруг INSTALLLEVEL, а не наоборотвокруг.

Редактировать:

Условия компонентов оцениваются перед отображением диалоговых окон установки.Таким образом, вы не можете обусловить функцию с помощью диалогового элемента управления (например, флажка или кнопки).

Решение состоит в том, чтобы использовать настраиваемое действие, которое изменяет действие функции на основе вашего настраиваемого свойства.Например, вы можете использовать функцию MsiSetFeatureState .Вы можете найти учебник по индивидуальным действиям здесь: http://www.codeproject.com/KB/install/msicustomaction.aspx

...