ReplaceDLL.nsh revision ad27e1d5e48ca41245120c331cc88b50464813ce
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; Macro - Upgrade DLL File
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; Written by Joost Verburg
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; ------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; Parameters:
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; LOCALFILE - Location of the new DLL file (on the compiler system)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; DESTFILE - Location of the DLL file that should be upgraded
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; (on the user's system)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; TEMPBASEDIR - Directory on the user's system to store a temporary file
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; when the system has to be rebooted.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; For Win9x support, this should be on the same volume as the
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; DESTFILE!
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; The Windows temp directory could be located on any volume,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; so you cannot use this directory.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; Define REPLACEDLL_NOREGISTER if you want to upgrade a DLL that does not
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; have to be registered.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; Note: If you want to support Win9x, you can only use
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; short filenames (8.3).
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; Example of usage:
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync; !insertmacro ReplaceDLL "dllname.dll" "$SYSDIR\dllname.dll" "$SYSDIR"
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync!macro ReplaceDLL LOCALFILE DESTFILE TEMPBASEDIR
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Push $R0
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Push $R1
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Push $R2
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Push $R3
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Push $R4
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Push $R5
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Unique number for labels
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync !define REPLACEDLL_UNIQUE ${__LINE__}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Copy the parameters used on run-time to a variable
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;This allows the usage of variables as parameter
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync StrCpy $R4 "${DESTFILE}"
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync StrCpy $R5 "${TEMPBASEDIR}"
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Check file and version
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync IfFileExists $R4 0 replacedll.copy_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;ClearErrors
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ; GetDLLVersionLocal "${LOCALFILE}" $R0 $R1
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ; GetDLLVersion $R4 $R2 $R3
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;IfErrors replacedll.upgrade_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;IntCmpU $R0 $R2 0 replacedll.done_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ; replacedll.upgrade_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;IntCmpU $R1 $R3 replacedll.done_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ; replacedll.done_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ; replacedll.upgrade_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Let's replace the DLL!
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync SetOverwrite try
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;replacedll.upgrade_${REPLACEDLL_UNIQUE}:
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync !ifndef REPLACEDLL_NOREGISTER
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Unregister the DLL
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync UnRegDLL $R4
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync !endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Try to copy the DLL directly
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ClearErrors
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync StrCpy $R0 $R4
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Call :replacedll.file_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync IfErrors 0 replacedll.noreboot_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;DLL is in use. Copy it to a temp file and Rename it on reboot.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync GetTempFileName $R0 $R5
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Call :replacedll.file_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Rename /REBOOTOK $R0 $R4
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Register the DLL on reboot
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync !ifndef REPLACEDLL_NOREGISTER
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync "Register $R4" 'rundll32.exe "$R4",DllRegisterServer'
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync !endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Goto replacedll.done_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;DLL does not exist - just extract
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync replacedll.copy_${REPLACEDLL_UNIQUE}:
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync StrCpy $R0 $R4
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Call :replacedll.file_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Register the DLL
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync replacedll.noreboot_${REPLACEDLL_UNIQUE}:
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync !ifndef REPLACEDLL_NOREGISTER
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync RegDLL $R4
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync !endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Done
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync replacedll.done_${REPLACEDLL_UNIQUE}:
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Pop $R5
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Pop $R4
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Pop $R3
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Pop $R2
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Pop $R1
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Pop $R0
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;End
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Goto replacedll.end_${REPLACEDLL_UNIQUE}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Called to extract the DLL
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync replacedll.file_${REPLACEDLL_UNIQUE}:
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync File /oname=$R0 "${LOCALFILE}"
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Return
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync replacedll.end_${REPLACEDLL_UNIQUE}:
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;------------------------
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ;Restore settings
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync SetOverwrite lastused
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync !undef REPLACEDLL_UNIQUE
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync!macroend
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync