как узнать, обновляется ли, ремонтируется или удаляется в installscript

Я пытаюсь написать код InstallScript в проекте Basic MSI. Я хотел бы знать, как определить, является ли установка Обновлением, Восстановлением или Удалением.

Ничего из этого не работает в InstallScript.

 REMOVE~="ALL"
 NOT Installed
 REINSTALL<>""
 PATCH<>""
 REMOVEALLMODE

Я нашел этот блог и этот флаг MAINTENANCE работает. Но он может только определить, является ли это начальной установкой или нет. Всегда «ИСТИНА» в параметрах «Обновление, восстановление и удаление».

Любая помощь приветствуется.


person black dragon    schedule 12.01.2016    source источник
comment
Используете ли вы проект InstallScript или код InstallScript в каком-либо проекте MSI (либо Basic MSI, либо InstallScript MSI)? Большинство упомянутых вами элементов связаны с MSI и поэтому либо не имеют значения, либо требуют дополнительных действий для использования в коде InstallScript.   -  person Michael Urman    schedule 14.01.2016
comment
@MichaelUrman обновлен. это базовый проект MSI.   -  person black dragon    schedule 15.01.2016
comment
Краткий ответ: вызовите MsiEvaluateCondition (он доступен в InstallScript) с такими параметрами, как условия.   -  person Michael Urman    schedule 15.01.2016
comment
Это работает, наконец. Спасибо. Можете ли вы опубликовать это снова как ответ?   -  person black dragon    schedule 18.01.2016


Ответы (1)


Размещенные вами примеры строк являются примерами установщика Windows. Условия. Вы не можете просто вырезать и вставить их в InstallScript if. Вместо этого вам нужно вызвать MsiEvaluateCondition, чтобы установщик Windows обработал их.

// Note that MSICONDITION_TRUE is 1; I forgot to test whether it's defined
if MSICONDITION_TRUE = MsiEvaluateCondition(hMSI, "Not Installed") then
    MessageBox("First-time installation", INFORMATION;
endif;

Обратите внимание, что это применимо только к установкам на основе MSI. Для чистого проекта InstallScript API-интерфейсы установщика Windows в значительной степени недоступны или непригодны для использования, и вместо этого вы должны поместить код в соответствующий обработчик событий (например, OnFirstUIBefore).

person Michael Urman    schedule 23.01.2016