UpgradeDLL now supports paths that contain variables

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3312 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
joostverburg 2003-12-24 18:38:18 +00:00
parent 7c5e1bda63
commit e272318725
2 changed files with 40 additions and 18 deletions

View file

@ -472,6 +472,8 @@ There is also a copy of this macro in the Include folder, so you only have to in
\c Push $R1 \c Push $R1
\c Push $R2 \c Push $R2
\c Push $R3 \c Push $R3
\c Push $R4
\c Push $R5
\c \c
\c ;------------------------ \c ;------------------------
\c ;Unique number for labels \c ;Unique number for labels
@ -479,13 +481,20 @@ There is also a copy of this macro in the Include folder, so you only have to in
\c !define UPGRADEDLL_UNIQUE ${__LINE__} \c !define UPGRADEDLL_UNIQUE ${__LINE__}
\c \c
\c ;------------------------ \c ;------------------------
\c ;Copy the parameters used on run-time to a variable
\c ;This allows the usage of variables as paramter
\c
\c StrCpy $R4 "${DESTFILE}"
\c StrCpy $R5 "${TEMPBASEDIR}"
\c
\c ;------------------------
\c ;Check file and version \c ;Check file and version
\c \c
\c IfFileExists "${DESTFILE}" 0 upgradedll.copy_${UPGRADEDLL_UNIQUE} \c IfFileExists $R4 0 upgradedll.copy_${UPGRADEDLL_UNIQUE}
\c \c
\c ClearErrors \c ClearErrors
\c GetDLLVersionLocal "${LOCALFILE}" $R0 $R1 \c GetDLLVersionLocal "${LOCALFILE}" $R0 $R1
\c GetDLLVersion "${DESTFILE}" $R2 $R3 \c GetDLLVersion $R4 $R2 $R3
\c IfErrors upgradedll.upgrade_${UPGRADEDLL_UNIQUE} \c IfErrors upgradedll.upgrade_${UPGRADEDLL_UNIQUE}
\c \c
\c IntCmpU $R0 $R2 0 upgradedll.done_${UPGRADEDLL_UNIQUE} upgradedll.upgrade_${UPGRADEDLL_UNIQUE} \c IntCmpU $R0 $R2 0 upgradedll.done_${UPGRADEDLL_UNIQUE} upgradedll.upgrade_${UPGRADEDLL_UNIQUE}
@ -500,30 +509,30 @@ There is also a copy of this macro in the Include folder, so you only have to in
\c upgradedll.upgrade_${UPGRADEDLL_UNIQUE}: \c upgradedll.upgrade_${UPGRADEDLL_UNIQUE}:
\c !ifndef UPGRADEDLL_NOREGISTER \c !ifndef UPGRADEDLL_NOREGISTER
\c ;Unregister the DLL \c ;Unregister the DLL
\c UnRegDLL "${DESTFILE}" \c UnRegDLL $R4
\c !endif \c !endif
\c \c
\c ;------------------------ \c ;------------------------
\c ;Try to copy the DLL directly \c ;Try to copy the DLL directly
\c \c
\c ClearErrors \c ClearErrors
\c StrCpy $R0 "${DESTFILE}" \c StrCpy $R0 $R4
\c Call :upgradedll.file_${UPGRADEDLL_UNIQUE} \c Call :upgradedll.file_${UPGRADEDLL_UNIQUE}
\c IfErrors 0 upgradedll.noreboot_${UPGRADEDLL_UNIQUE} \c IfErrors 0 upgradedll.noreboot_${UPGRADEDLL_UNIQUE}
\c \c
\c ;------------------------ \c ;------------------------
\c ;DLL is in use. Copy it to a temp file and Rename it on reboot. \c ;DLL is in use. Copy it to a temp file and Rename it on reboot.
\c \c
\c GetTempFileName $R0 "${TEMPBASEDIR}" \c GetTempFileName $R0 $R5
\c Call :upgradedll.file_${UPGRADEDLL_UNIQUE} \c Call :upgradedll.file_${UPGRADEDLL_UNIQUE}
\c Rename /REBOOTOK $R0 "${DESTFILE}" \c Rename /REBOOTOK $R0 $R4
\c \c
\c ;------------------------ \c ;------------------------
\c ;Register the DLL on reboot \c ;Register the DLL on reboot
\c \c
\c !ifndef UPGRADEDLL_NOREGISTER \c !ifndef UPGRADEDLL_NOREGISTER
\c WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ \c WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \
\c "Register ${DESTFILE}" '"$SYSDIR\rundll32.exe" "${DESTFILE}",DllRegisterServer' \c "Register $R4" '"$SYSDIR\rundll32.exe" "$R4",DllRegisterServer'
\c !endif \c !endif
\c \c
\c Goto upgradedll.done_${UPGRADEDLL_UNIQUE} \c Goto upgradedll.done_${UPGRADEDLL_UNIQUE}
@ -532,7 +541,7 @@ There is also a copy of this macro in the Include folder, so you only have to in
\c ;DLL does not exist - just extract \c ;DLL does not exist - just extract
\c \c
\c upgradedll.copy_${UPGRADEDLL_UNIQUE}: \c upgradedll.copy_${UPGRADEDLL_UNIQUE}:
\c StrCpy $R0 "${DESTFILE}" \c StrCpy $R0 $R4
\c Call :upgradedll.file_${UPGRADEDLL_UNIQUE} \c Call :upgradedll.file_${UPGRADEDLL_UNIQUE}
\c \c
\c ;------------------------ \c ;------------------------
@ -540,7 +549,7 @@ There is also a copy of this macro in the Include folder, so you only have to in
\c \c
\c upgradedll.noreboot_${UPGRADEDLL_UNIQUE}: \c upgradedll.noreboot_${UPGRADEDLL_UNIQUE}:
\c !ifndef UPGRADEDLL_NOREGISTER \c !ifndef UPGRADEDLL_NOREGISTER
\c RegDLL "${DESTFILE}" \c RegDLL $R4
\c !endif \c !endif
\c \c
\c ;------------------------ \c ;------------------------
@ -548,6 +557,8 @@ There is also a copy of this macro in the Include folder, so you only have to in
\c \c
\c upgradedll.done_${UPGRADEDLL_UNIQUE}: \c upgradedll.done_${UPGRADEDLL_UNIQUE}:
\c \c
\c Pop $R5
\c Pop $R4
\c Pop $R3 \c Pop $R3
\c Pop $R2 \c Pop $R2
\c Pop $R1 \c Pop $R1

View file

@ -29,20 +29,29 @@
Push $R1 Push $R1
Push $R2 Push $R2
Push $R3 Push $R3
Push $R4
Push $R5
;------------------------ ;------------------------
;Unique number for labels ;Unique number for labels
!define UPGRADEDLL_UNIQUE ${__LINE__} !define UPGRADEDLL_UNIQUE ${__LINE__}
;------------------------
;Copy the parameters used on run-time to a variable
;This allows the usage of variables as paramter
StrCpy $R4 "${DESTFILE}"
StrCpy $R5 "${TEMPBASEDIR}"
;------------------------ ;------------------------
;Check file and version ;Check file and version
IfFileExists "${DESTFILE}" 0 upgradedll.copy_${UPGRADEDLL_UNIQUE} IfFileExists $R4 0 upgradedll.copy_${UPGRADEDLL_UNIQUE}
ClearErrors ClearErrors
GetDLLVersionLocal "${LOCALFILE}" $R0 $R1 GetDLLVersionLocal "${LOCALFILE}" $R0 $R1
GetDLLVersion "${DESTFILE}" $R2 $R3 GetDLLVersion $R4 $R2 $R3
IfErrors upgradedll.upgrade_${UPGRADEDLL_UNIQUE} IfErrors upgradedll.upgrade_${UPGRADEDLL_UNIQUE}
IntCmpU $R0 $R2 0 upgradedll.done_${UPGRADEDLL_UNIQUE} upgradedll.upgrade_${UPGRADEDLL_UNIQUE} IntCmpU $R0 $R2 0 upgradedll.done_${UPGRADEDLL_UNIQUE} upgradedll.upgrade_${UPGRADEDLL_UNIQUE}
@ -57,30 +66,30 @@
upgradedll.upgrade_${UPGRADEDLL_UNIQUE}: upgradedll.upgrade_${UPGRADEDLL_UNIQUE}:
!ifndef UPGRADEDLL_NOREGISTER !ifndef UPGRADEDLL_NOREGISTER
;Unregister the DLL ;Unregister the DLL
UnRegDLL "${DESTFILE}" UnRegDLL $R4
!endif !endif
;------------------------ ;------------------------
;Try to copy the DLL directly ;Try to copy the DLL directly
ClearErrors ClearErrors
StrCpy $R0 "${DESTFILE}" StrCpy $R0 $R4
Call :upgradedll.file_${UPGRADEDLL_UNIQUE} Call :upgradedll.file_${UPGRADEDLL_UNIQUE}
IfErrors 0 upgradedll.noreboot_${UPGRADEDLL_UNIQUE} IfErrors 0 upgradedll.noreboot_${UPGRADEDLL_UNIQUE}
;------------------------ ;------------------------
;DLL is in use. Copy it to a temp file and Rename it on reboot. ;DLL is in use. Copy it to a temp file and Rename it on reboot.
GetTempFileName $R0 "${TEMPBASEDIR}" GetTempFileName $R0 $R5
Call :upgradedll.file_${UPGRADEDLL_UNIQUE} Call :upgradedll.file_${UPGRADEDLL_UNIQUE}
Rename /REBOOTOK $R0 "${DESTFILE}" Rename /REBOOTOK $R0 $R4
;------------------------ ;------------------------
;Register the DLL on reboot ;Register the DLL on reboot
!ifndef UPGRADEDLL_NOREGISTER !ifndef UPGRADEDLL_NOREGISTER
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \
"Register ${DESTFILE}" '"$SYSDIR\rundll32.exe" "${DESTFILE}",DllRegisterServer' "Register $R4" '"$SYSDIR\rundll32.exe" "$R4",DllRegisterServer'
!endif !endif
Goto upgradedll.done_${UPGRADEDLL_UNIQUE} Goto upgradedll.done_${UPGRADEDLL_UNIQUE}
@ -89,7 +98,7 @@
;DLL does not exist - just extract ;DLL does not exist - just extract
upgradedll.copy_${UPGRADEDLL_UNIQUE}: upgradedll.copy_${UPGRADEDLL_UNIQUE}:
StrCpy $R0 "${DESTFILE}" StrCpy $R0 $R4
Call :upgradedll.file_${UPGRADEDLL_UNIQUE} Call :upgradedll.file_${UPGRADEDLL_UNIQUE}
;------------------------ ;------------------------
@ -97,7 +106,7 @@
upgradedll.noreboot_${UPGRADEDLL_UNIQUE}: upgradedll.noreboot_${UPGRADEDLL_UNIQUE}:
!ifndef UPGRADEDLL_NOREGISTER !ifndef UPGRADEDLL_NOREGISTER
RegDLL "${DESTFILE}" RegDLL $R4
!endif !endif
;------------------------ ;------------------------
@ -105,6 +114,8 @@
upgradedll.done_${UPGRADEDLL_UNIQUE}: upgradedll.done_${UPGRADEDLL_UNIQUE}:
Pop $R5
Pop $R4
Pop $R3 Pop $R3
Pop $R2 Pop $R2
Pop $R1 Pop $R1