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