Smile2Me
26th November 2001 19:19 UTC
Automatic uninstall
I'm trying to construct the following:
My setup detects whether or not it has been installed already
and gives a message about this observation. If the user chooses
not to overwrite (so make a backup) then my setup copies everything
it can discover in $INSTDIR to $TEMP and calls the uninstall of the
previous (installed) version. If this uninstall was succesful, the
setup continues installing the new version.
2 problems:
1) is there a way to execute the uninstall "silently"? Normally the
uninstall contains things like "You're uninstalling!!! Continue???".
Can the new setup shut these things down at runtime and run the
uninstall silently?
2) the setup executes the uninstall using ExecWait, but it actually
doesn't wait for the uninstall to be closed. The setup just continues
and (obviously) observes that uninstall was not succesfull. How can I
get the install to wait for the uninstall?
thx, greetz,
- :D Hendri :D -
Smile2Me
28th November 2001 17:02 UTC
please help me out....
does nobody have an answer to my questions above???
Please help me out...
Thx,
- :D Hendri :D -
justin
29th November 2001 03:02 UTC
If the uninstaller was generated with 1.7b2 or later, you can do this:
ExecWait '"$INSTDIR\uninst.exe" /S _=$INSTDIR'
Delete $INSTDIR\uninst.exe ; the uninstaller won't be able to delete itself when run above.
      
      And that will silently uninstall and wait. The /S switch will be ignored on earlier uninstallers, but the uninstaller will be executed and waited for though.
      
      -Justin
    
 
    
      Smile2Me
      29th November 2001 06:36 UTC
      thx...
      Thx Justin!
      
      I'll try your solution.
      
      Greetz,
      
      - :D Hendri :D -
     
    
      Smile2Me
      30th November 2001 08:05 UTC
      Detection of silent uninstall
      Still a question about this silent uninstall:
      
      How to detect at runtime that my uninstall is run silently?
      The problem: the /S parameter disappears from the commandline
      at run time, so I cannot check this...
      
      My Uninstall has to know this to be able block usermessages like
      MessageBox MB_YESNO "You are uninstalling! Continue?"
      
      Thx,
      
      - :D Hendri :D -
     
    
      eccles
      30th November 2001 22:02 UTC
      When the uninstaller has _=$INSTDIR passed to it you should find that the problem of other parameters going missing will stop. The uninstaller normally copies to and relaunches itself from the $TEMP directory, but the presence of the _= parameter fools it into thinking this has already happened.
      
      Btw, here's a general purpose function I use for getting parameters from the command-line that hopefully might be useful.
      
; GetNextParm
;   Processes the next parameter, which may be quoted, from the string on the
;   top of the stack.
; Usage:
;   Push <parameters>
;   Call GetNextParm
;   Pop <next parameter>
;   Pop <remaining parameters>
Function GetNextParm
  Exch $0
  Push $1
  Push $9
  Push $8
  StrCpy $1 ""
; Trim leading space
TrimLeading:
  StrCpy $9 $0 1
  StrCmp $9 "" Done
  StrCmp $9 '"' DelimitQuote
  StrCmp $9 " " "" DelimitSpace
  StrCpy $0 $0 "" 1
  Goto TrimLeading
; Begin a quote-delimited parameter
DelimitQuote:
  StrCpy $0 $0 "" 1
  Goto CopyParm
; Begin a space-delimited parameter
DelimitSpace:
  StrCpy $9 " "
; Extract the parameter
CopyParm:
  StrCpy $8 $0 1
  StrCmp $8 "" Done
  StrCpy $0 $0 "" 1
  StrCmp $8 $9 Done
  StrCpy $1 $1$8
  Goto CopyParm
Done:
  Pop $8
  Pop $9
  Exch $1
  Exch
  Exch $0
  Exch
FunctionEnd
e.g.
      
  Push $CMDLINE
  Call GetNextParm
  Pop $0 ; exe name
  StrCpy $9 "" ; /S flag
ParmsLoop:
  Call GetNextParm
  Pop $0
  StrCmp $0 "" ParmsDone ; No more parms
  StrCpy $1 $0 2
  StrCmp $1 "_=" ParmsDone ; No more /useful/ parms
  StrCmp $0 "/S" ParmSlashS
  Goto ParmsLoop
ParmSlashS:
  StrCpy $9 "Y"
  Goto ParmsLoop
ParmsDone:
  Pop $0 ; Tidy the stack
  StrCmp $9 "Y" Silent NotSilent
etc...
      Good luck :)
      
      Dave.
    
 
    
      Smile2Me
      2nd December 2001 08:20 UTC
      thx...
      Thx Dave,
      
      your solution (GetNextParm) work great!
      
      Besides that I would like to inform you about the fact that the
      solution by Justin (with /S parameter and deleting uninstall after
      the actual uninstall) doesn't work on slow machines (like mine).
      
      After ExecWait returns, Windows hasn't really shut down the program,
      so we cannot delete it. Use something like:
      
      code:-----------------------------------------------------------------
      ExecWait '"$INSTDIR\uninst.exe" /S _=$INSTDIR'
      Sleep 500 ; wait for the uninstall to close
      Delete $INSTDIR\uninst.exe ; the uninstaller won't be able to delete itself when run above.
      ----------------------------------------------------------------------
      
      This works fine on my machine!
      
      Good luck, thx again Dave, greetz,
      
      - :D Hendri :D -