diff options
Diffstat (limited to 'Include/UpgradeDLL.nsh')
-rwxr-xr-x | Include/UpgradeDLL.nsh | 406 |
1 files changed, 203 insertions, 203 deletions
diff --git a/Include/UpgradeDLL.nsh b/Include/UpgradeDLL.nsh index ad88dda..ba10674 100755 --- a/Include/UpgradeDLL.nsh +++ b/Include/UpgradeDLL.nsh @@ -1,203 +1,203 @@ -/*
-
-NOTE:
------
-This macro is provided for backwards compatibility with NSIS 2.0 scripts.
-It's recommended you update your scripts to use the new Library.nsh macros.
-
-
-Macro - Upgrade DLL File
-Written by Joost Verburg
-------------------------
-
-Parameters:
-LOCALFILE Location of the new DLL file (on the compiler system)
-DESTFILE Location of the DLL file that should be upgraded (on the user's system)
-TEMPBASEDIR Directory on the user's system to store a temporary file when the system has
- to be rebooted.
- For Win9x/ME support, this should be on the same volume as DESTFILE.
- The Windows temp directory could be located on any volume, so you cannot use
- this directory.
-
-Define UPGRADEDLL_NOREGISTER if you want to upgrade a DLL that does not have to be registered.
-
-Notes:
-
-* If you want to support Windows 9x/ME, you can only use short filenames (8.3).
-
-* This macro uses the GetDLLVersionLocal command to retrieve the version of local libraries.
- This command is only supported when compiling on a Windows system.
-
-------------------------
-
-Example:
-
-!insertmacro UpgradeDLL "dllname.dll" "$SYSDIR\dllname.dll" "$SYSDIR"
-
-*/
-
-!ifndef UPGRADEDLL_INCLUDED
-
-!define UPGRADEDLL_INCLUDED
-
-!macro __UpgradeDLL_Helper_AddRegToolEntry mode filename tempdir
-
- Push $R0
- Push $R1
- Push $R2
- Push $R3
-
- ;------------------------
- ;Copy the parameters
-
- Push "${filename}"
- Push "${tempdir}"
-
- Pop $R2 ; temporary directory
- Pop $R1 ; file name to register
-
- ;------------------------
- ;Advance counter
-
- StrCpy $R0 0
- ReadRegDWORD $R0 HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "count"
- IntOp $R0 $R0 + 1
- WriteRegDWORD HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "count" "$R0"
-
- ;------------------------
- ;Setup RegTool
-
- ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "NSIS.Library.RegTool.v2"
- StrCpy $R3 $R3 -4 1
- IfFileExists $R3 +3
-
- File /oname=$R2\NSIS.Library.RegTool.v2.$HWNDPARENT.exe "${NSISDIR}\Bin\RegTool.bin"
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \
- "NSIS.Library.RegTool.v2" '"$R2\NSIS.Library.RegTool.v2.$HWNDPARENT.exe" /S'
-
- ;------------------------
- ;Add RegTool entry
-
- WriteRegStr HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "$R0.file" "$R1"
- WriteRegStr HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "$R0.mode" "${mode}"
-
- Pop $R3
- Pop $R2
- Pop $R1
- Pop $R0
-
-!macroend
-
-!macro UpgradeDLL LOCALFILE DESTFILE TEMPBASEDIR
-
- Push $R0
- Push $R1
- Push $R2
- Push $R3
- Push $R4
- Push $R5
-
- !define UPGRADEDLL_UNIQUE "${__FILE__}${__LINE__}"
-
- SetOverwrite try
-
- ;------------------------
- ;Copy the parameters used on run-time to a variable
- ;This allows the usage of variables as paramter
-
- StrCpy $R4 "${DESTFILE}"
- StrCpy $R5 "${TEMPBASEDIR}"
-
- ;------------------------
- ;Get version information
-
- IfFileExists $R4 0 "upgradedll.copy_${UPGRADEDLL_UNIQUE}"
-
- ClearErrors
- GetDLLVersionLocal "${LOCALFILE}" $R0 $R1
- GetDLLVersion $R4 $R2 $R3
- IfErrors "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}"
-
- IntCmpU $R0 $R2 0 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}"
- IntCmpU $R1 $R3 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.done_${UPGRADEDLL_UNIQUE}" \
- "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}"
-
- ;------------------------
- ;Upgrade
-
- "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}:"
- !ifndef UPGRADEDLL_NOREGISTER
- ;Unregister the DLL
- UnRegDLL $R4
- !endif
-
- ;------------------------
- ;Copy
-
- ClearErrors
- StrCpy $R0 $R4
- Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}"
- IfErrors 0 "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}"
-
- ;------------------------
- ;Copy on reboot
-
- GetTempFileName $R0 $R5
- Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}"
- Rename /REBOOTOK $R0 $R4
-
- ;------------------------
- ;Register on reboot
-
- !insertmacro __UpgradeDLL_Helper_AddRegToolEntry 'D' $R4 $R5
-
- Goto "upgradedll.done_${UPGRADEDLL_UNIQUE}"
-
- ;------------------------
- ;DLL does not exist
-
- "upgradedll.copy_${UPGRADEDLL_UNIQUE}:"
- StrCpy $R0 $R4
- Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}"
-
- ;------------------------
- ;Register
-
- "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}:"
- !ifndef UPGRADEDLL_NOREGISTER
- RegDLL $R4
- !endif
-
- ;------------------------
- ;Done
-
- "upgradedll.done_${UPGRADEDLL_UNIQUE}:"
-
- Pop $R5
- Pop $R4
- Pop $R3
- Pop $R2
- Pop $R1
- Pop $R0
-
- ;------------------------
- ;End
-
- Goto "upgradedll.end_${UPGRADEDLL_UNIQUE}"
-
- ;------------------------
- ;Extract
-
- "upgradedll.file_${UPGRADEDLL_UNIQUE}:"
- File /oname=$R0 "${LOCALFILE}"
- Return
-
- "upgradedll.end_${UPGRADEDLL_UNIQUE}:"
-
- SetOverwrite lastused
-
- !undef UPGRADEDLL_UNIQUE
-
-!macroend
-
-!endif
+/* + +NOTE: +----- +This macro is provided for backwards compatibility with NSIS 2.0 scripts. +It's recommended you update your scripts to use the new Library.nsh macros. + + +Macro - Upgrade DLL File +Written by Joost Verburg +------------------------ + +Parameters: +LOCALFILE Location of the new DLL file (on the compiler system) +DESTFILE Location of the DLL file that should be upgraded (on the user's system) +TEMPBASEDIR Directory on the user's system to store a temporary file when the system has + to be rebooted. + For Win9x/ME support, this should be on the same volume as DESTFILE. + The Windows temp directory could be located on any volume, so you cannot use + this directory. + +Define UPGRADEDLL_NOREGISTER if you want to upgrade a DLL that does not have to be registered. + +Notes: + +* If you want to support Windows 9x/ME, you can only use short filenames (8.3). + +* This macro uses the GetDLLVersionLocal command to retrieve the version of local libraries. + This command is only supported when compiling on a Windows system. + +------------------------ + +Example: + +!insertmacro UpgradeDLL "dllname.dll" "$SYSDIR\dllname.dll" "$SYSDIR" + +*/ + +!ifndef UPGRADEDLL_INCLUDED + +!define UPGRADEDLL_INCLUDED + +!macro __UpgradeDLL_Helper_AddRegToolEntry mode filename tempdir + + Push $R0 + Push $R1 + Push $R2 + Push $R3 + + ;------------------------ + ;Copy the parameters + + Push "${filename}" + Push "${tempdir}" + + Pop $R2 ; temporary directory + Pop $R1 ; file name to register + + ;------------------------ + ;Advance counter + + StrCpy $R0 0 + ReadRegDWORD $R0 HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "count" + IntOp $R0 $R0 + 1 + WriteRegDWORD HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "count" "$R0" + + ;------------------------ + ;Setup RegTool + + ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "NSIS.Library.RegTool.v2" + StrCpy $R3 $R3 -4 1 + IfFileExists $R3 +3 + + File /oname=$R2\NSIS.Library.RegTool.v2.$HWNDPARENT.exe "${NSISDIR}\Bin\RegTool.bin" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ + "NSIS.Library.RegTool.v2" '"$R2\NSIS.Library.RegTool.v2.$HWNDPARENT.exe" /S' + + ;------------------------ + ;Add RegTool entry + + WriteRegStr HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "$R0.file" "$R1" + WriteRegStr HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "$R0.mode" "${mode}" + + Pop $R3 + Pop $R2 + Pop $R1 + Pop $R0 + +!macroend + +!macro UpgradeDLL LOCALFILE DESTFILE TEMPBASEDIR + + Push $R0 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + + !define UPGRADEDLL_UNIQUE "${__FILE__}${__LINE__}" + + SetOverwrite try + + ;------------------------ + ;Copy the parameters used on run-time to a variable + ;This allows the usage of variables as paramter + + StrCpy $R4 "${DESTFILE}" + StrCpy $R5 "${TEMPBASEDIR}" + + ;------------------------ + ;Get version information + + IfFileExists $R4 0 "upgradedll.copy_${UPGRADEDLL_UNIQUE}" + + ClearErrors + GetDLLVersionLocal "${LOCALFILE}" $R0 $R1 + GetDLLVersion $R4 $R2 $R3 + IfErrors "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}" + + IntCmpU $R0 $R2 0 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}" + IntCmpU $R1 $R3 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.done_${UPGRADEDLL_UNIQUE}" \ + "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;Upgrade + + "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}:" + !ifndef UPGRADEDLL_NOREGISTER + ;Unregister the DLL + UnRegDLL $R4 + !endif + + ;------------------------ + ;Copy + + ClearErrors + StrCpy $R0 $R4 + Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}" + IfErrors 0 "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;Copy on reboot + + GetTempFileName $R0 $R5 + Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}" + Rename /REBOOTOK $R0 $R4 + + ;------------------------ + ;Register on reboot + + !insertmacro __UpgradeDLL_Helper_AddRegToolEntry 'D' $R4 $R5 + + Goto "upgradedll.done_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;DLL does not exist + + "upgradedll.copy_${UPGRADEDLL_UNIQUE}:" + StrCpy $R0 $R4 + Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;Register + + "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}:" + !ifndef UPGRADEDLL_NOREGISTER + RegDLL $R4 + !endif + + ;------------------------ + ;Done + + "upgradedll.done_${UPGRADEDLL_UNIQUE}:" + + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Pop $R0 + + ;------------------------ + ;End + + Goto "upgradedll.end_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;Extract + + "upgradedll.file_${UPGRADEDLL_UNIQUE}:" + File /oname=$R0 "${LOCALFILE}" + Return + + "upgradedll.end_${UPGRADEDLL_UNIQUE}:" + + SetOverwrite lastused + + !undef UPGRADEDLL_UNIQUE + +!macroend + +!endif |