У нас есть специальное действие, которое мы хотим запустить ТОЛЬКО при серьезном обновлении. Проблема в том, что CA откладывается, потому что ему нужен доступ к системным файлам (он удаляет старую версию программы из INI-файла). Поскольку CA откладывается, он имеет доступ только к свойству CustomActionData.
Итак, моей первой попыткой было установить CustomActionData, если UPGRADINGPRODUCTCODE было true, и затем подготовить CA, который фактически выполнил обновление на CustomActionData. Это не удалось - CustomActionData не был установлен, я полагаю, потому что он виден только в пределах настраиваемого действия и не может использоваться в качестве условия для настраиваемого действия.
Вот те CA, которые я определил:
<CustomAction Id="MyCA.SetProperty" Return="check" Property="MyCA"
Value="[UPGRADINGPRODUCTCODE]" />
<CustomAction
Id="MyCA"
BinaryKey="MyIniProcessingProgram"
ExeCommand="MyArgs"
Execute="deferred"
Impersonate="no"
Return="ignore"/>
А вот моя InstallExecuteSequence:
<RemoveExistingProducts After="InstallValidate" />
<Custom Action="MyCA.SetProperty" Before="InstallFinalize"/>
<Custom Action="MyCA" After="MyCA.SetProperty">
CustomActionData
</Custom>
Я также пробовал:
- Установление MyCA.SetProperty в зависимости от UPGRADINGPRODUCTCODE, затем планирование MyCA после него - не работает, потому что даже если MyCA.SetProperty не запускается, действие «После» работает.
Было бы лучше, если бы мы могли избежать действий JavaScript / VBScript или прибегнуть к проверке значения CustomActionData в самой программе обновления INI; идея состоит в том, чтобы сделать сам CA условным, поэтому мы не запускаем его, если условие (значительное обновление) не выполняется.