Announcement

Collapse
No announcement yet.

Spawned uninstaller instance

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Spawned uninstaller instance

    Hello.
    I need to insert MUI_UNPAGE_CONFIRM and disable a message in my uninstaller while running it from the installer. To detect if the uninstaller was spawned, I made-up a commandline switch "/U".
    PHP Code:
    ExecWait "$UNINSTSTR /U _?=$UNINST\\bin" 
    Is there an easier way?

    The problem is inserting the confirm unpage macro inside a function that causes a compile-time error: command PageEx not valid in a Function.
    PHP Code:
    Un-Confirm page

    Function un.confirm
      StrCmp $SPAWN 
    "1" done
      
    !insertmacro MUI_UNPAGE_CONFIRM
      done
    :
    FunctionEnd 
    By way of explaining how I arrived at this point, I have two functions in the uninstaller that test for the /U switch.
    PHP Code:
    Variables
    Var SPAWN

    Search in a string from right to left
    Usage:
    ;  
    Push "this is a long ass string"
    ;  Push "ass"
    ;  Call (un.)StrStrRight
    ;  Pop $R0
    ;  ($R0 at this point is "ass string")
    Function 
    un.StrStrRight
      Exch $R1 
    st=haystack,old$R1$R1=needle
      Exch    
    st=old$R1,haystack
      Exch $R2 
    st=old$R1,old$R2$R2=haystack
      Push $R3
      Push $R4
      Push $R5
      StrLen $R3 $R1
      StrLen $R4 $R2
      IntOp $R4 $R4 
    1
      loop
    :
        
    StrCpy $R5 $R2 $R3 $R4
        StrCmp $R5 $R1 done
        StrCmp $R5 
    "" done
        IntOp $R4 $R4 
    1
        
    Goto loop
    done
    :
      
    IntOp $R4 $R4 1
      StrCpy $R1 $R2 
    "" $R4
      Pop $R5
      Pop $R4
      Pop $R3
      Pop $R2
      Exch $R1
    FunctionEnd

    ; Return length from end of string
    Usage:
    ;  
    user variable "SPAWN" equals characters to end of string
    ;  where "/U" is the last commandline parameterthe output contains 1
    Function un.spawn
      Push $CMDLINE
      Push 
    "/U"
      
    Call un.StrStrRight
      Pop $R0
      StrLen $SPAWN $R0
    FunctionEnd

    Function un.onInit
      Call un
    .spawn 
    ...
    FunctionEnd 
    PS: Potentially, you could hard-code the switch and query with 'IfSpawned', similar to 'IfSilent' ... just an idea.

    edit:

    Almost forgot. "Normally" you skip pages with an Abort call in a custom function. Normally. Aborting unpage confirm, aborts the uninstaller.
    PHP Code:
    Un-Confirm page

    !define MUI_PAGE_CUSTOMFUNCTION_PRE un.confirm
    !insertmacro MUI_UNPAGE_CONFIRM

    Function un.confirm
      StrCmp $SPAWN 
    "1" done
        Abort
      done
    :
    FunctionEnd 
    Why?
    Last edited by bnicer; 2 May 2007, 17:53.

  • #2
    My uninstaller script has few twists in it. It should be straightforward and yet pages aren't skipped. I've tried Abort with MUI_UNPAGE_WELCOME too and it only aborts the application. When I run the uninstaller alone or, when I launch it from the installer without any precondition, a pure Abort page callback, simply, well... aborts.

    Comment


    • #3
      Yep. Calling the Abort function in un.onInit wasn't the brightest thing I ever did. Crap happens.

      Comment


      • #4
        So does Abort in the pre function work or not?
        NSIS FAQ | NSIS Home Page | Donate $
        "I hear and I forget. I see and I remember. I do and I understand." -- Confucius

        Comment


        • #5
          The PRE function works, it skips the page. It did not abort the uninstaller. I was confused. The uninstaller aborted from un.onInit and you can't put !insertmacro MUI_UNPAGE_CONFIRM into a function that skips the page. Really confused.

          Comment


          • #6
            ExecWait:
            The NSIS documentation insists on an extra pair of quotes to delimit the command proper from the commandline parameters, or "it [ExecWait] will not work on Windows 9x with or without parameters". I'm less than convinced this applies also where the command is stored in a variable. I ran an uninstaller with ExecWait on 95 and 98 and not having additional quotes didn't give me problems, although putting the command in quotes is probably safer.
            PHP Code:
            ExecWait '"$UNINSTSTR" /U _?=$UNINST\\bin' 
            It works.

            Comment

            Working...
            X