2014-10-06 3 views
0

Я в значительной степени новичок в NSIS; но у меня есть проблема, и я уже посмотрел все, что могу найти на этом сайте, а также поиск в Google, чтобы искать ответы; и до сих пор у меня ничего нет.Каталог установки NSIS по умолчанию - хотите выбрать на основе опций установки

У меня есть пакет установки NSIS, который меня попросили расширить, чтобы он установил любую из четырех связанных программ. Однако, если они связаны, они должны установить их в другую папку.

У меня есть MUI_INSTALLOPTIONS_READ, которая определяет четыре (взаимоисключающих) переключателя, и это работает нормально; и он будет ждать, пока после этого выбора не будет предложено установить место установки. Но это не позволит мне устанавливать разные папки для каждого приложения.

Первое, что я делаю в каждой ветке после MUI_INSTALLOPTIONS_READ, - установить $ INSTDIR в путь по умолчанию для выбранного приложения; поэтому я ожидал бы использовать эту строку в качестве значения по умолчанию при вызове InstallDir; но это не так - это пусто.

Конечно, я не могу переместить MUI_INSTALLOPTIONS_READ до InstallDir в коде, потому что он должен быть в разделе; и я не могу переместить InstallDir после MUI_INSTALLOPTIONS_READ, потому что он НЕ МОЖЕТ быть в разделе (или функции). Я попытался разделить раздел, содержащий MUI_INSTALLOPTIONS_READ, так что между ним и следующим разделом есть пробел и вставка InstallDir в это пространство; но это ничего не изменило.

Кто-нибудь знает, как сделать то, что я пытаюсь сделать? Спасибо за любые предложения, которые вы можете предложить.

!ifndef PRODUCT_VERSION 
    !error "Version required ! Usage: makensisw.exe /DPRODUCT_VERSION=version scriptfile.nsi" 
!endif 

; HM NIS Edit Wizard helper defines 
!define PRODUCT_NAME "ProductX" 
!define PRODUCT_PUBLISHER "ACME Technologies" 
!define PRODUCT_WEB_SITE "http://www.google.com" 
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe" 
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" 
!define PRODUCT_UNINST_ROOT_KEY "HKLM" 

; MUI 1.67 compatible ------ 
!include "MUI.nsh" 

; MUI Settings 
!define MUI_ABORTWARNING 
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" 
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" 

; Welcome page 
!insertmacro MUI_PAGE_WELCOME 
; Full Install or Demo page 
Page custom FIOrDemo 
; Directory page 
!insertmacro MUI_PAGE_DIRECTORY 
; Instfiles page 
!insertmacro MUI_PAGE_INSTFILES 

; Language files 
!insertmacro MUI_LANGUAGE "English" 

;Reserve Files 
ReserveFile "appSelect.ini" 
    !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS 

; Variables 
Var APP1_INSTALL 
Var APP2_INSTALL 
Var APP3_INSTALL 
Var APP4_INSTALL 

; MUI end ------ 


Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" 
OutFile "Setup.exe" 
    InstallDir $INSTDIR 
    ; InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" 
    ShowInstDetails show 
    ShowUnInstDetails show 

Section "Main Section" SEC01 
SetOutPath "$INSTDIR" 
SetOverwrite try 
SetShell VarContext all 

    ; pop $0 
; ${While} $0  != "Marker" 
;  DetailPrint 'Extra info: $0' 
;  pop $0 
; ${EndWhile} 
; Pop $0  ; restore 

    !insertmacro MUI_INSTALLOPTIONS_READ $APP2_INSTALL "appSelect.ini" "Field 2" "State" 
    !insertmacro MUI_INSTALLOPTIONS_READ $APP1_INSTALL "appSelect.ini" "Field 3" "State" 
    !insertmacro MUI_INSTALLOPTIONS_READ $APP3_INSTALL "appSelect.ini" "Field 4" "State" 
    !insertmacro MUI_INSTALLOPTIONS_READ $APP4_INSTALL "appSelect.ini" "Field 5" "State" 
    DetailPrint 'Install selection $APP2_INSTALL $APP1_INSTALL $APP3_INSTALL $APP4_INSTALL ' 
    StrCmp $APP1_INSTALL 1 app1_selected 
    StrCmp $APP2_INSTALL 1 app2_selected 
    StrCmp $APP3_INSTALL 1 app3_selected 
    StrCmp $APP4_INSTALL 1 app4_selected 
    Goto continue 

app1_selected: 
    Strcpy $INSTDIR "$PROGRAMFILES\Folder1" 
    Call InstallApp1 
    Goto continue 

app2_selected: 
    Strcpy $INSTDIR "$PROGRAMFILES\Folder2" 
    Call InstallApp2 
    Goto continue 

app3_selected: 
    Strcpy $INSTDIR "$PROGRAMFILES\Folder3" 
    Call InstallApp3 
    Goto continue 

app4_selected: 
    Strcpy $INSTDIR "$PROGRAMFILES\Folder4" 
    Call InstallApp4 
    Goto continue 

continue: 


SectionEnd 


Section -Post 
    ; Force reboot after install 
    MessageBox MB_ICONINFORMATION|MB_OK "Installation complete. Your computer will now restart." 
    ; Reboot 
SectionEnd 

Function InstallApp1 
;Copy all application files 
FunctionEnd 

Function InstallApp2 
;Copy all application files 
FunctionEnd 

Function InstallApp3 
    ;Copy all application files 
FunctionEnd 

Function InstallApp4 
;Copy all application files 
FunctionEnd 

Function .onInit 
    ;Extract InstallOptions INI files 
    !insertmacro MUI_INSTALLOPTIONS_EXTRACT "appSelect.ini" 
FunctionEnd 

Function FIOrDemo 
    !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "" 
    !insertmacro MUI_INSTALLOPTIONS_DISPLAY "appSelect.ini" 
FunctionEnd 

ответ

1

$InstDir Попробуйте установить в leave обратного вызова для пользовательской страницы или pre обратного вызова для страницы каталога. Я также рекомендую вам использовать раздел для каждого приложения, а затем вы можете выполнить всю конфигурацию, прежде чем перейти на страницу instfiles.

Также можно использовать компоненты страницы с хелперов радио макросов в sections.nsh вместо пользовательской страницы ...

!include MUI.nsh 
!include LogicLib.nsh 
Page Custom MyCustomPageCreate MyCustomPageLeave 
!insertmacro MUI_PAGE_DIRECTORY 
!insertmacro MUI_PAGE_INSTFILES 
!insertmacro MUI_LANGUAGE English 

Function .onInit 
InitPluginsDir 
WriteIniStr "$PluginsDir\page.ini" Settings NumFields 2 
WriteIniStr "$PluginsDir\page.ini" "Field 1" Type RadioButton 
WriteIniStr "$PluginsDir\page.ini" "Field 1" Text "App 1" 
WriteIniStr "$PluginsDir\page.ini" "Field 1" State 1 
WriteIniStr "$PluginsDir\page.ini" "Field 1" Left 20 
WriteIniStr "$PluginsDir\page.ini" "Field 1" Right -10 
WriteIniStr "$PluginsDir\page.ini" "Field 1" Top 20 
WriteIniStr "$PluginsDir\page.ini" "Field 1" Bottom 40 
WriteIniStr "$PluginsDir\page.ini" "Field 2" Type RadioButton 
WriteIniStr "$PluginsDir\page.ini" "Field 2" Text "App 2" 
WriteIniStr "$PluginsDir\page.ini" "Field 2" Left 20 
WriteIniStr "$PluginsDir\page.ini" "Field 2" Right -10 
WriteIniStr "$PluginsDir\page.ini" "Field 2" Top 40 
WriteIniStr "$PluginsDir\page.ini" "Field 2" Bottom 60 
FunctionEnd 

Function MyCustomPageCreate 
!insertmacro INSTALLOPTIONS_DISPLAY "page.ini" 
FunctionEnd 

Function MyCustomPageLeave 
!insertmacro MUI_INSTALLOPTIONS_READ $0 "page.ini" "Field 1" "State" 
${If} $0 <> 0 
    StrCpy $InstDir "$ProgramFiles\App1" 
${Else} 
    StrCpy $InstDir "$ProgramFiles\App2" 
${EndIf} 
FunctionEnd 
+0

Спасибо за предложение. Мне придется потратить некоторое время на изучение, чтобы понять, что все эти вещи («оставить обратные вызовы», «предварительные обратные вызовы», «страница справочника», «страница instfiles» - имена дают мне смутное представление о какие они есть, но я не знаком с ними - «новичок», в конце концов). Я вернусь к вам, если у меня возникнут вопросы, или (я надеюсь), чтобы вы знали, что проблема решена. –

+0

В вашем случае FIOrDemo - это обратный вызов для создания. Для пользовательских страниц синтаксис «Страница изготовлен на заказ% create%% leave%», а для обычных страниц - «Страница% name%% pre%% show%% leave%, но для страниц MUI вы должны использовать определение. быть зарегистрированным. – Anders

+0

Прочитав кучу руководства и попытавшись присвоить $ INSTDIR в запросах «отпуск» и «пре», как вы предложили, я чувствую себя немного менее похожим на новичков, но до сих пор не смог получить это должно сработать. Я просто оставлю это на этом и продолжаю, но я хотел еще раз вернуться к колодцу, чтобы убедиться, что, возможно, вы могли бы подумать о чем-нибудь еще со времени вашего последнего сообщения. Если нет, я благодарю вас за то, что вы сделали это, я пытаюсь понять, как создать вторую настраиваемую страницу для замены стандартной страницы InstallDir. –

Смежные вопросы