NSIS - заставить пользователя выбрать другой каталог

До сих пор я понял, как определить предыдущую установку моего программного обеспечения, прочитав ключи реестра и проверив, существует ли каталог. (Оба хорошо задокументированы в файле справки NSIS). Теперь я хочу заставить пользователя указать другой каталог, если приложение было установлено ранее. (Не хочу принудительно удалять самостоятельно, потому что предыдущие версии просто удаляли все, включая сохраненные данные).

Насколько я понимаю, в MUI2.nsh есть предопределенные шаблоны для лицензии, папки установки, индикатора выполнения и т. Д. Как мне добавить проверку на этом этапе в поток установщика?

Обновление. Пробовал решение Пола, но оно не работает. В верхней части сценария я объявил

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE validateDirectory
!insertmacro MUI_PAGE_DIRECTORY

чтобы обратиться к этой функции:

Function validateDirectory
ReadRegStr $R0 HKLM "SOFTWARE\Aadhaar Enrolment Client" "Installdir"
Pop $R0
StrCmp $R0 $OUTDIR +1 +3
MessageBox MB_ICONSTOP|MB_OK 'The directory $OUTDIR already exists.Please choose a different directory.'
Abort
FunctionEnd

Эта функция отображает сообщение, но не прерывается. Более того, если я нажму «назад» на странице выбора каталога и снова нажму «вперед», то установка просто продолжится.


person Rex    schedule 09.12.2011    source источник
comment
Давненько ... нет решения? Особенно тот, который не использует MUI?   -  person e40    schedule 01.04.2015
comment
Нет .. И я давно перестал использовать NSIS.   -  person Rex    schedule 01.04.2015
comment
Я просто упомяну, что я заставил это работать с помощью форума NSIS. forum.winamp.com/showthread.php?t=380848   -  person e40    schedule 01.04.2015
comment
Используя MUI, решение Пола отлично работало для меня (NSIS 2.3, Abort здесь не вызывала никаких проблем)   -  person Mallard    schedule 02.09.2015


Ответы (1)


Вам необходимо указать функцию «Покинуть» для страницы каталога, подобной этой.

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE LeaveDirectory
!insertmacro MUI_PAGE_DIRECTORY

и это вызовет функцию, указанную при нажатии кнопки Далее.

Затем создайте функцию LeaveDirectory с логикой, необходимой для проверки выбранного каталога, и если каталог будет определен как недопустимый, просто вызовите Abort в функции, и установщик не перейдет к следующему шагу.

Документация находится на странице this в разделе "Custom Функции », но поскольку вам нужно развернуть заголовок« Пользовательские функции страницы », к сожалению, это неочевидно.

person Paul Hunt    schedule 09.12.2011
comment
Спасибо. Итак, если я это сделаю, будет ли он оставаться на экране каталога до тех пор, пока пользователь не выберет действительный каталог? - person Rex; 09.12.2011
comment
Верный. Пока вы вызываете Abort в функции, когда каталог недействителен, он не переходит на следующую страницу. - person Paul Hunt; 09.12.2011
comment
Если я попробую, что Abort не работает, как описано здесь, он переводит установщик в плохое состояние, когда весь пользовательский ввод игнорируется, передается во все, что находится под установщиком, и переводится в фоновый процесс в диспетчере задач ... но все еще можно переключить с помощью Alt-Tab! Очень странный... - person jheriko; 06.01.2015
comment
И это решение заставляет использовать MUI, к которому я еще не ходил. Я очень хотел бы решить эту проблему. - person e40; 01.04.2015