bdbaddog
22nd January 2011 01:29 UTC
in .OnInit StrCpy $INSTDIR "c:\MYDIR" has no effect?
Greetings,
Here's my complete .OnInit
Function .onInit
# Change default base dir to C:\COMPANY
StrCpy $INSTDIR "C:\COMPANY"
InitPluginsDir
!insertmacro MULTIUSER_INIT
ReadRegStr $R0 HKLM \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" \
"UninstallString"
StrCmp $R0 "" done
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
"$(^Name) is already installed. $\n$\nClick `OK` to remove the \
previous version or `Cancel` to cancel this upgrade." \
IDOK uninst
Abort
;Run the uninstaller
uninst:
ClearErrors
# let's get the install dir of previous version by copying all
# but the /uinstall.exe from the full path to the uninstaller.exe
#
StrCpy $R1 $R0 -13
ExecWait '$R0 _?=$R1' ;Do not copy the uninstaller to a temp file
IfErrors no_remove_uninstaller done
;You can either use Delete /REBOOTOK in the uninstaller or add some code
;here to remove the uninstaller. Use a registry key to check
;whether the user has chosen to uninstall. If you are using an uninstaller
;components page, make sure all sections are uninstalled.
no_remove_uninstaller:
done:
FunctionEnd
When I run the installer it still prompts me to install into:
c:\Program Files (x86)\myProduct
It seems like StrCpy $INSTDIR in the .OnInit is having no effect.
Any sugguestions on how to make this work?
jiake
22nd January 2011 07:12 UTC
For that you have specified InstallDir in your script, to replace the defualt one, using InstallDir $INSTDIR.
bdbaddog
23rd January 2011 02:43 UTC
InstallDir is $INSTDIR no change
Thanks for the suggestion.
It wasn't in my file.
I changed it, an still no change.
When it gets to the "Chose Install Location" page, it still defaulting to
c:\Program Files (x86)\Blah
I created a dummy installer with .onInit setting $INSTDIR and InstallDir $INSTDIR see below. It also doesn't obey my StrCpy $INSTDIR "C:\BLAH"..
Can someone else try the below, you'll need a README.txt in your work dir..
I'm hoping it's something really simple that I"m missing.
_Bill
# Auto-generated by EclipseNSIS Script Wizard
# Jan 22, 2011 6:37:58 PM
Name "My Application"
# General Symbol Definitions
!define REGKEY "SOFTWARE\$(^Name)"
# MultiUser Symbol Definitions
!define MULTIUSER_EXECUTIONLEVEL Standard
!define MULTIUSER_INSTALLMODE_COMMANDLINE
!define MULTIUSER_INSTALLMODE_INSTDIR "My Application"
!define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY "${REGKEY}"
!define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUE "Path"
# MUI Symbol Definitions
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY}
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "My Application"
!define MUI_UNFINISHPAGE_NOAUTOCLOSE
# Included files
!include MultiUser.nsh
!include Sections.nsh
!include MUI2.nsh
# Variables
Var StartMenuGroup
# Installer pages
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
# Installer languages
!insertmacro MUI_LANGUAGE English
# Installer attributes
OutFile setup.exe
InstallDir $INSTDIR
CRCCheck on
XPStyle on
ShowInstDetails hide
InstallDirRegKey HKLM "${REGKEY}" Path
ShowUninstDetails hide
# Installer sections
Section -Main SEC0000
SetOutPath $INSTDIR
SetOverwrite on
File README.txt
WriteRegStr HKLM "${REGKEY}\Components" Main 1
SectionEnd
Section -post SEC0001
WriteRegStr HKLM "${REGKEY}" Path $INSTDIR
SetOutPath $INSTDIR
WriteUninstaller $INSTDIR\uninstall.exe
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
SetOutPath $SMPROGRAMS\$StartMenuGroup
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk" $INSTDIR\uninstall.exe
!insertmacro MUI_STARTMENU_WRITE_END
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)"
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\uninstall.exe
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe
WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1
WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1
SectionEnd
# Macro for selecting uninstaller sections
!macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID
Push $R0
ReadRegStr $R0 HKLM "${REGKEY}\Components" "${SECTION_NAME}"
StrCmp $R0 1 0 next${UNSECTION_ID}
!insertmacro SelectSection "${UNSECTION_ID}"
GoTo done${UNSECTION_ID}
next${UNSECTION_ID}:
!insertmacro UnselectSection "${UNSECTION_ID}"
done${UNSECTION_ID}:
Pop $R0
!macroend
# Uninstaller sections
Section /o -un.Main UNSEC0000
Delete /REBOOTOK $INSTDIR\README.txt
DeleteRegValue HKLM "${REGKEY}\Components" Main
SectionEnd
Section -un.post UNSEC0001
DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk"
Delete /REBOOTOK $INSTDIR\uninstall.exe
DeleteRegValue HKLM "${REGKEY}" StartMenuGroup
DeleteRegValue HKLM "${REGKEY}" Path
DeleteRegKey /IfEmpty HKLM "${REGKEY}\Components"
DeleteRegKey /IfEmpty HKLM "${REGKEY}"
RmDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup
RmDir /REBOOTOK $INSTDIR
SectionEnd
# Installer functions
Function .onInit
StrCpy $INSTDIR "C:\BLAHBLAH"
InitPluginsDir
!insertmacro MULTIUSER_INIT
FunctionEnd
# Uninstaller functions
Function un.onInit
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup
!insertmacro MULTIUSER_UNINIT
!insertmacro SELECT_UNSECTION Main ${UNSEC0000}
FunctionEnd
MSG
23rd January 2011 09:01 UTC
I think "InstallDir $INSTDIR" is kind of pointless. the idea is to set the value of $instdir...
bdbaddog
25th January 2011 19:01 UTC
is it $INSTDIR or $instdir
Either way.. The sample script doesn't alter the default install dir.
Doe anyone have a sample script which does?
Afrow UK
25th January 2011 21:52 UTC
Try commenting out the two !define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_* lines.
Stu
bdbaddog
25th January 2011 23:06 UTC
Got it..
This works
Function .onInit
InitPluginsDir
!insertmacro MULTIUSER_INIT
StrCpy $INSTDIR "C:\BLAHBLAH"
FunctionEnd
This doesn't work
Function .onInit
StrCpy $INSTDIR "C:\BLAHBLAH"
InitPluginsDir
!insertmacro MULTIUSER_INIT
FunctionEnd
It looks like "!insermacro MULTIUSER_INIT" must overwrite $INSTDIR
bdbaddog
26th January 2011 00:26 UTC
Also found you need to not define
MULTIUSER_INSTALLMODE_INSTDIR
Or it will prefix $INSTDIR as follows
!ifdef MULTIUSER_INSTALLMODE_INSTDIR
StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}"
!endif