Я пытаюсь установить одну из двух функций в зависимости от значения, которое должно быть установлено внутри настраиваемого действия.
Во-первых, я устанавливаю значение свойства:
UINT __stdcall ConfigurationCheckAction(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_INSTALL_FAILURE;
hr = WcaInitialize(hInstall, "ConfigurationCheckAction");
if (condition) {
MsiSetProperty( hInstall, TEXT("STREAM"), TEXT("RED") );
}
else {
MsiSetProperty( hInstall, TEXT("STREAM"), TEXT("BLUE") );
}
return WcaFinalize(er);
}
Во-вторых, я делаю два условия на две функции:
<Feature Id='Complete' Level='1'>
<Feature Id="Red" ConfigurableDirectory="TARGETDIR" Title="F1" Level="0">
<Condition Level="1">STREAM</Condition>
</Feature>
<Feature Id="Blue" ConfigurableDirectory="TARGETDIR" Title="F2" Level="0">
<Condition Level="1">NOT STREAM</Condition>
</Feature>
</Feature>
Обратите внимание, что я не определяю свойство внутри файла wxs ранее, так как я хотел бы установить его из настраиваемого действия.
Мое настраиваемое действие вызывается до установки InstallInitialize и немедленного выполнения.
Из журнала установки у меня есть подтверждение, что свойство установлено.
Тем не менее, моя условная установка не работает, так как кажется, что то, что находится в условии, всегда оценивается как ложное.
Я пытался оценить условия:
STREAM, STREAM = RED, STREAM = «RED», < ! [CDATA [STREAM = RED]]>
У меня заканчиваются идеи, что делать, и буду признателен за помощь.
Я сделал что-то подобное, но мы закончили тем, что контролировали это на уровне компонентов (добавив условие к <Component/>
элементы вместо элемента элемента, использующего преобразование во время жары). Но наше условие использует CDATA, а также использует двойные кавычки для значения, которое вы не перечислили в том, что вы пробовали. Итак, сначала я попробую следующие условия в ваших функциях:
<Condition><![CDATA[STREAM="RED"]]></Condition>
<Condition><![CDATA[STREAM="BLUE"]]></Condition>
Если это все еще не работает, я бы попробовал следующее:
Добавьте свойство STREAM со значением по умолчанию к вашему WiX. Затем протестируйте его с этим значением по умолчанию, чтобы увидеть, заставляет ли его работать значение по умолчанию. Это может означать, что вам нужно установить свойство раньше, возможно, отключив событие пользовательского интерфейса. <Property Id="STREAM" Value="RED"/>
В качестве последнего средства вы можете добавить условия к каждому компоненту, как я, но мы сделали это только по очень конкретным причинам, надеюсь, вы сможете использовать условную функцию для работы с приведенными выше предложениями!
Я надеюсь, что вышеизложенное решит вашу проблему или, по крайней мере, приведет вас к ответу!
Слишком поздно, чтобы проверить все это, но здесь идет с некоторой информацией. Я проверю завтра. По сути, я думаю, что проблема заключается в последовательности пользовательских действий. Попробуйте до калькуляции.
Некоторые вещи для рассмотрения:
CostInitialize
? Вы заявляете, что установили его до InstallInitialize, но вместо этого попробуйте его до CostInitialize (возможно, вы пытались).InstallUISequence
так же хорошо как InstallExecuteSequence
? Вам нужно вставить обе последовательности в случае, если установка работает в беззвучном режиме. До CostInitialize
в обеих последовательностях я верю.Честно говоря, это немного безумие. Также имейте в виду, что есть особенность действий (что произойдет с функцией) и установленные состояния (в каком состоянии он находится). Документация по функциям Win32 должна объяснить.
Перекрестные ссылки для легкого поиска:
Спасибо за ваши ответы. В конце концов, сочетание ваших предложений помогло мне.
Я хочу заявить, что сделал, а что не сработало:
<Condition><![CDATA[STREAM="RED"]]></Condition>