yyv,
Можно сделать примерно так (пример на этапе инсталляции):
1. Команды не в коем случае не перемещать - здесь очень важна последовательность действий!
2. Константы иницилизируем, только в функции
OnInit, потом будет поздно и значения констант определяем только после отработки макроса
PRODUCTNAME и следовательно, объявляем значения констант после макроса - банальная последовательность действий
3.
Это извращение, проще хранить значения в переменных. причем в данном случае в объявленных переменных, может быть покажу, когда именно, в какой момент нужно делать - здесь вся загвоздка.
Код:
!include "MUI2.nsh"
!include "Logiclib.nsh"
OutFile file.exe
!macro PRODUCTNAME
ReadINIStr $R1 "$EXEDIR\settings.ini" "PRODUCT_NAME" "Text"
${IfNot} $R1 == ""
StrCpy $R1 "$R1"
${Else}
ClearErrors
StrCpy $R1 "это NSIS ${NSIS_VERSION}" ;если $R1 = "пустому значению", то назначаем по умолчанию значение
${EndIf}
!macroend
!define MUI_WELCOMEPAGE_TITLE "$R1"
!define PRODUCT_NAME "$R1"
Caption "$R1"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails show
Function .OnInit
!insertmacro PRODUCTNAME
FunctionEnd
Section ""
MessageBox MB_ICONINFORMATION|MB_OK ${PRODUCT_NAME}$\n$\r$R1
SectionEnd