I need to ask user for several paths before installation, but i cannot get it done in NSIS. Seems like my code doesnt get referenced in MUI:
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico""
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!define MUI_CUSTOMPAGECOMMANDS
!define MUI_DIRECTORYPAGE
!define MUI_CUSTOMFUNCTION_COMPONENTS_LEAVE ComponentPost
!define MUI_CUSTOMFUNCTION_DIRECTORY_SHOW DirectoryShow
!define MUI_CUSTOMFUNCTION_DIRECTORY_LEAVE DirectoryLeave
And at compilation I get
install function "ComponentPost" not referenced - zeroing code (0-2) out
install function "DirectoryShow" not referenced - zeroing code (2-49) out
install function "DirectoryLeave" not referenced - zeroing code (49-61) out
Obviously, it the code of these three functions doesnt get executed
First time I see !define MUI_CUSTOMPAGECOMMANDS and some others. There is no reference for them in NSIS or manual. What are them?
If you want to add page Directory into your installer use macro named MUI_PAGE_DIRECTORY (and not MUI_DIRECTORYPAGE)
To add PRE/SHOW/LEAVE functions for this page use
MUI_PAGE_CUSTOMFUNCTION_PRE function
MUI_PAGE_CUSTOMFUNCTION_SHOW function
MUI_PAGE_CUSTOMFUNCTION_LEAVE function
These defines should be set before inserting a page macro.
I think the easiest way for you is to modify an existing example (can be found in NSIS\Examples directory), your script does not make a sense at all.
Related
I'm trying to write an NSIS script using MUI2 and for some reason it refuses to show an image on the welcome page. I have tried using MUI_WELCOMEFINISHPAGE_BITMAP as instructed in the NSIS wiki and manual. I have used ${NSISDIR} to reference the included bitmaps. I have tried using a full path to the included bitmaps. I have tried using a path to a bitmap in my installation files directory.
No matter what I do, I end up with a Welcome page that has a title and text, but no image. The build process gives no warnings or errors concerning the welcome bitmap. The installer installs everything correctly. There's just no image on the welcome page and I cannot figure out why.
This is my first attempt at using NSIS, so there's probably something I'm missing. The section of my .nsi file with the page definitions is below. Any help would be appreciated.
!include MUI2.nsh
# Install Warcraft II BattleNet Edition and dependencies.
Name "Warcraft II Windows 10 Setup"
Outfile "Warcraft Win10 Setup.exe"
InstallDir "C:\ISO"
# !define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
!define MUI_WELCOMEPAGE_TITLE "Warcraft II for Windows 10"
!define MUI_WELCOMEPAGE_TEXT "Ready to work!$\r$\n$\r$\nWith just a few simple steps, our peons will have you ready to play Warcraft II on Windows 10."
!insertmacro MUI_PAGE_WELCOME
!define MUI_DIRECTORYPAGE_TEXT_TOP "Choose a location to store the Warcraft II CD-ROM (ISO) image."
!define MUI_DIRECTORYPAGE_TEXT_DESTINATION "ISO Image Folder"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_TEXT "Work complete!"
!insertmacro MUI_PAGE_FINISH
Also make sure that the bmp is really 24 bit. Otherwise it will not be rendered.
I found the solution and am posting for anyone else experiencing the same problem.
In short, the answer is: !insertmacro MUI_LANGUAGE "English"
Apparently, one must specify a language for a bitmap to show up. Makes total sense, huh? And yes, Virginia, that was sarcasm.
I figured this out by taking the example from the website below and commenting lines out until I reproduced my problem with the lack of a bitmap image appearing on the welcome page.
https://nsis.sourceforge.io/Examples/Modern%20UI/WelcomeFinish.nsi
The working code looks like this:
!include MUI2.nsh
# Install Warcraft II BattleNet Edition and dependencies.
Name "Warcraft II Windows 10 Setup"
Outfile "Warcraft Win10 Setup.exe"
InstallDir "C:\ISO"
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
!define MUI_WELCOMEPAGE_TITLE "Warcraft II for Windows 10"
!define MUI_WELCOMEPAGE_TEXT "Ready to work!$\r$\n$\r$\nWith just a few simple steps, our peons will have you ready to play Warcraft II on Windows 10."
!insertmacro MUI_PAGE_WELCOME
!define MUI_DIRECTORYPAGE_TEXT_TOP "Choose a location to store the Warcraft II CD-ROM (ISO) image."
!define MUI_DIRECTORYPAGE_TEXT_DESTINATION "ISO Image Folder"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_TEXT "Work complete!"
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
So I made patch installer for certain game. It works nicely, dumb design decisions of NSIS notwithstanding. I use NSIS 3.03 with MUI2.
Due to nature of patch (it is not separate application, just patch applied on already existing program) I had to use pretty much all custom texts for installer (like MUI_WELCOMEPAGE_TITLE, MUI_WELCOMEPAGE_TEXT etc). Grammar of my native language didn't helped.
But then I foolishly wanted to include uninstaller. While it works, it seems like there are almost no custom texts for it. Only ones that work are MUI_UNCONFIRMPAGE_TEXT_TOP and MUI_UNCONFIRMPAGE_TEXT_LOCATION. Other default texts for uninstallator look like crap due to aforementioned issues (patch instead of real app, grammar).
For example, on welcome page of uninstaller there is text similar to "Before starting the uninstallation, make sure [NAME OF PATCH TO GAME] is not running.". It should be something like "Before starting the uninstallation, make sure [NAME OF GAME, NOT NAME OF PATCH] is not running.". No, there is no MUI_UNWELCOMEPAGE_TEXT or anything like that.
How to change other texts in uninstaller? This kind of oversight is silly for 10 year old installer creator on its third major version. WTF?
From the documentation:
Page settings apply to a single page and should be set before inserting a page macro. The same settings can be used for installer and uninstaller pages. You have to repeat the setting if you want it to apply to multiple pages.
!include MUI2.nsh
!define MUI_WELCOMEPAGE_TEXT "Installer blah blah"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_WELCOMEPAGE_TEXT "Uninstaller blah blah"
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Section
SetOutPath "$InstDir"
WriteUninstaller "$InstDir\Un.exe"
ExecShell "" "$InstDir\Un.exe"
SectionEnd
Section Uninstall
Delete "$InstDir\Un.exe"
RMDir "$InstDir"
SectionEnd
I have built an installer, which consists of 5 sections/components. I have created a pre-function before the components page to check which components are installed, only the components that are not currently installed should be shown on the components page.
!define MUI_PAGE_CUSTOMFUNCTION_PRE selectSections
!insertmacro MUI_PAGE_COMPONENTS
...
Function selectSections
; remove sections which are already installed
ReadRegStr $0 HKLM "${REG_INSTALL}" "SEC_EXTRACTOR"
IfErrors +2
!insertmacro RemoveSection ${SEC_EXTRACTOR}
!insertmacro SelectSection ${SEC_EXTRACTOR}
; so on for all components
FunctionEnd
So I install all the components first, and then run the installer again. This time I do not see any components on the components page. But when I press install on that page, all the sections are still executed. Can anyone help ?
(I have pressed the install button from a components page, that does not list any components. but I see those sections being installed in the details pane.)
Don't use relative jumps to skip macros because a macro can be more that one instruction. Use IfErrors label or ${If} ${Errors} from LogicLib.nsh.
Does anyone have a basic NSIS script example that is "installer based on zip"? Or could tell me the command? I know NSIS has that tool built in, but I want to edit a script based on that. NSIS only outputs an .exe of the installer based on zip. I would like to start from script code.
Thanks.
The zip2exe tool generates a simple script that it passes to makensis, most of the code is in files it includes:
!define ZIP2EXE_COMPRESSOR_ZLIB
!define ZIP2EXE_INSTALLDIR "c:\foo"
!include "${NSISDIR}\Contrib\zip2exe\Base.nsh" ; You could edit this if you wanted to keep using zip2exe
!include "${NSISDIR}\Contrib\zip2exe\Classic.nsh"
!insertmacro SECTION_BEGIN
File "file1fromzip.txt"
File "file2fromzip.exe"
!insertmacro SECTION_END
you can use the following script to extract the zip files in the destination location and before you compile this script you need to download the ZipDLL.dll place it in your NSIS installation folder.
OutFile "Zip.exe"
section
ZipDLL::extractall "C:\Users\raj\Desktop\envConfig.zip" "C:\Program Files (x86)\Zip"
sectionend
To build on Anders answer, a few additional things should be done in the latest version. In particular ZIP2EXE_NAME and ZIP2EXE_OUTFILE should be set:
!define ZIP2EXE_COMPRESSOR_ZLIB
!define ZIP2EXE_INSTALLDIR "c:\foo"
!define ZIP2EXE_NAME "My Application"
!define ZIP2EXE_OUTFILE "MyInstaller.exe"
!include "${NSISDIR}\Contrib\zip2exe\Base.nsh"
!include "${NSISDIR}\Contrib\zip2exe\Classic.nsh"
!insertmacro SECTION_BEGIN
File "file1fromzip.txt"
File "file2fromzip.exe"
!insertmacro SECTION_END
Classic.nsh can be replaced with Modern.nsh for the "Modern" UI.
Also note that either the files need to be enumerated in the "File" section, or if you have your files in a folder, you can include the entire contents:
File /r MyFolder\*.*
This will NOT create "MyFolder" inside the install target directory.
I am using HM NIS Edit 2.03. For my setup installation, I need to open a help file at the end of the installation. The file may be a pdf, notepad or a word page file. I tried !define MUI_FINISHPAGE_RUN but it does not work.
MUI_FINISHPAGE_RUN can only start real applications, to start other things you can use MUI_FINISHPAGE_SHOWREADME. If you are already using MUI_FINISHPAGE_SHOWREADME for something else you can use a custom run function:
Function MyFinishRun
ExecShell "" "$instdir\readme.doc"
FunctionEnd
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION MyFinishRun
!insertmacro MUI_PAGE_FINISH