Setup programs for Windows

Alberto, why did you chose NSIS to build setup programs? I don’t like it because its scripting language seems a mix between assembly and shell scripting and it doesn’t even have flow control statements, you have to use Goto!

Moreover you have to do manually everthing, for instance to copy a file that later can be uninstalled you need this code:

; Copy the file
File "example.exe"

; Create shortcuts.
CeateDirectory "$SMPROGRAMS\Example"
CreateShortCut "$SMPROGRAMS\Example\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
CreateShortCut "$SMPROGRAMS\Example\Example.lnk" "$INSTDIR\example.exe" "" "$INSTDIR\example.exe" 0

; Copy the uninstaller.
WriteUninstaller "uninstall.exe"

; Write the uninstall keys for Windows.
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example" "DisplayName" "NSIS Example"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersionUninstall\Example" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example" "NoRepair" 1 WriteUninstaller "uninstall.exe"

And then you have to uninstall everything manually:

; Delete registry keys.
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example"

; Remove files and uninstaller.
Delete $INSTDIR\example.exe
Delete $INSTDIR\uninstall.exe

; Remove shortcuts.
Delete "$SMPROGRAMS\Example\Uninstall.lnk"
Delete "$SMPROGRAMS\Example\Example.lnk"
RMDir "$SMPROGRAMS\Example"

; Remove the program directory.
RMDir "$INSTDIR"

I prefer Inno Setup, the nice thing is that for common tasks (copying files, creating shortcuts, adding registry keys, etc.) you only have to write a simple ini-like file, but if you need something more powerful you can use Pascal scripting.

The previous example in Inno Setup would be:

[Files]
Source: "example.exe"; DestDir: "{app}"

[Icons]
Name: "{group}\Example"; Filename: "{app}\example.exe"
Name: "{group}\Uninstall"; Filename: "{uninstallexe}"

Please, use Inno Setup! :)