; Current Usage:
;
;  Push "$SYSDIR\atl.dll"
;  !insertmacro UpgradeDLL "atl.dll"
;
; How about changing it to:
; !insertmacro UpgradeDLL "D:\DEV\Poject1\" "atl.dll" "$SYSDIR\atl.dll" "PARANOID" "BACKUP" ;prompt for overwrite/replace existing
; !insertmacro UpgradeDLL "D:\DEV\Poject1\" "atl.dll" "$SYSDIR\atl.dll" "EASYGOING" "NO_BACKUP" ;just do it and without backups

!macro UpgradeDLL DLL_FILE_PATH DLL_NAME DLL_LOCATION CON_PROMPT DO_BACKUP
	Push $1
	Push $2
	Push $3
	Push $4
	Push $5
	ClearErrors
	GetDLLVersionLocal ${DLL_NAME} $1 $2
	GetDLLVersion ${DLL_LOCATION} $3 $4
	IfErrors upgrade_${DLL_NAME}
	IntCmpU $1 $3 0 noupgrade_${DLL_NAME} upgrade_${DLL_NAME}
	IntCmpU $2 $4 noupgrade_${DLL_NAME} noupgrade_${DLL_NAME} upgrade_${DLL_NAME}
	upgrade_${DLL_NAME}:
		IfFileExists ${DLL_LOCATION} check_prompt_${DLL_NAME} dont_unreg_${DLL_NAME}
		
	check_prompt_${DLL_NAME}:
		StrCmp ${CON_PROMPT} "PARANOID" show_prompt_${DLL_NAME}
		StrCmp ${CON_PROMPT} "EASYGOING" check_backup_${DLL_NAME}
		
	show_prompt_${DLL_NAME}:
		MessageBox MB_MB_YESNO|MB_ICONEXCLAMATION "The file: ${DLL_LOCATION} \
			is older than the version needed for this application.  Would you \
			like to update your version of ${DLL_NAME}?  If you choose NO the \
			application may not run properly" \
			IDYES check_backup_${DLL_NAME} IDNO noupgrade_${DLL_NAME}
			
	check_backup_${DLL_NAME}:
		StrCmp ${DO_BACKUP} "BACKUP" do_backup_${DLL_NAME}
		StrCmp ${DO_BACKUP} "NO_BACKUP" dont_backup_${DLL_NAME}
		
	do_backup_${DLL_NAME}:
		CopyFiles "${DLL_LOCATION}" "$INSTDIR\Install_Backup" 0
		IfErrors upgrade_${DLL_NAME}
		sleep 500
		goto do_unreg_${DLL_NAME}
		
	dont_backup_${DLL_NAME}:
		goto do_unreg_${DLL_NAME}
		
	do_unreg_${DLL_NAME}:
		UnRegDLL "${DLL_LOCATION}"
		GetTempFileName $5
		File /oname=$5 "${DLL_FILE_PATH}${DLL_NAME}"
		rename /REBOOTOK $5 ${DLL_LOCATION}
		DetailPrint "Installed ${DLL_LOCATION}"
		IfRebootFlag regreboot_${DLL_NAME} regnoreboot_${DLL_NAME}
		
	dont_unreg_${DLL_NAME}:
		File /oname=${DLL_LOCATION} "${DLL_FILE_PATH}${DLL_NAME}"
		DetailPrint "Installed ${DLL_LOCATION}"
		goto regnoreboot_${DLL_NAME}
		
	regreboot_${DLL_NAME}:
		WriteRegStr HKLM Software\Microsoft\Windows\CurrentVersion\RunOnce ${DLL_LOCATION} "$SYSDIR\regsvr32 /s ${DLL_LOCATION}"
		goto done_${DLL_NAME}
		
	regnoreboot_${DLL_NAME}: 
		RegDLL ${DLL_LOCATION}
		goto done_${DLL_NAME}
		
	noupgrade_${DLL_NAME}:
		IntFmt $R3 "%X" $3
		IntFmt $R4 "%X" $4
		DetailPrint "*** Already installed ${DLL_LOCATION} $R3 $R4"
		
	done_${DLL_NAME}:
		Pop $5
		Pop $4
		Pop $3
		Pop $2
		Pop $1
		
	!undef DLL_FILE_PATH
	!undef DLL_NAME
	!undef DLL_LOCATION
	!undef CON_PROMPT
	!undef  DO_BACKUP
!macroend