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! 