- NSIS Discussion
- Validation
Archive: Validation
kgobel
12th June 2006 16:16 UTC
Validation
Hi, I have a custom page that asks for registration info, if the user enters the wrong stuff, a message box comes up and says "incorrect registration ID"
...the problem is..when the user clicks the cancel button...it asks if they want to exit...they click Yes, but then for some reason it seems the validation function is run again, and that message box comes up...and won't let them exit unless they click back
Afrow UK
12th June 2006 17:39 UTC
Let me guess...
Page Custom ShowFunc LeaveFunc
You are validating the page in the ShowFunc when it must be done in the LeaveFunc. The LeaveFunc is only called when the user clicks Next.
-Stu
kgobel
13th June 2006 15:34 UTC
Actually it's
Page custom RegistrationPage CheckID
CheckID is the validation code, I'm using that ExperienceUI, but I didn't think that would have anything to do it with it. ..It also only occurs when you enter an invalid key once, and then try to exit. If you simply go to the registration page..and click cancel..it exits...but if you go to the page, enter an invalid key..try it (displays error)...then try to exit...it won't let you.
I am using a custom made .dll for this? could this be the reason?
Afrow UK
13th June 2006 15:41 UTC
Did you make your own plugin to display this page?
Edit: In plugin DLL's you need to do validation when the WM_NOTIFY_OUTER_NEXT message is sent to the window procedure.
-Stu
kgobel
13th June 2006 16:18 UTC
thanks alot for helping me out Afro UK
hrmmmm...
I have a function in my DLL called check, all it does is check to see if the CD KEY is valid from a webserver, and returns a string telling if it's correct or incorrect..
  SetPluginUnload  alwaysoff ;don't know what this means
  System::Call 'Dll::CheckID(t, i) i("${REGID}", "4") .r0'
  System::Free 0
  SetPluginUnload  manual ;nor this...read it in a tut on wiki
      
      So I'm guessing the WM_NOTIFY_OUTER_NEXT doesn't apply to me here right?
    
    
      Afrow UK
      13th June 2006 16:20 UTC
      Ah I see. No it doesn't.
      Would you be able to post the code in question?
      If not then you can send it via PM.
      
      -Stu
     
    
    
      kgobel
      13th June 2006 16:40 UTC
      I always feel embarressed to post my code, but here we go..
      
      
Function CheckID
  ReadINIStr ${TEMP1} "$PLUGINSDIR\reg.ini" "Field 4" "State"
 
  SetPluginUnload  alwaysoff
  System::Call 'Dll::CheckID(t, i) i("${TEMP1}", "4") .r0'
  StrCmp $0 "1" done
  StrCmp $0 "2" incorrect
  StrCmp $0 "3" toomany
  System::Free 0
  SetPluginUnload  manual
  
  Goto done
  
  incorrect:
  MessageBox MB_ICONEXCLAMATION|MB_OK "Incorrect Registration ID"
  Abort
  
  toomany:
  MessageBox MB_ICONEXCLAMATION|MB_OK "This Registration ID has been used too many times.  Please call 800-999-9999"
  Abort
  done:
  
FunctionEnd
      
      I realize this is probably very inefficent with and terrible practice with these goto statements (might be the cause of the problem) but I can't seem to get the !if statements to work properly when using StrCmp as it doesn't seem to return true or false..it GOTOs somewhere if it's equal or GOTOs somewhere if it's not equal...so by all means if someone could post a better way, that would be great.
      
      I can also post the rest if you don't think that this function is the cause of the problem..
    
 
    
    
      Afrow UK
      13th June 2006 17:19 UTC
      Try this:
      
Function CheckID
  ReadINIStr ${TEMP1} "$PLUGINSDIR\reg.ini" "Field 4" "State"
  System::Call /NOUNLOAD 'Dll::CheckID(t, i) i("${TEMP1}", "4") .r0'
  StrCmp $0 "1" done
  StrCmp $0 "2" incorrect
  StrCmp $0 "3" toomany
  
  incorrect:
  MessageBox MB_ICONEXCLAMATION|MB_OK "Incorrect Registration ID"
  Abort
  
  toomany:
  MessageBox MB_ICONEXCLAMATION|MB_OK "This Registration ID has been used too many times.  Please call 800-999-9999"
  Abort
  done:
  
FunctionEnd
      
      LogicLib uses Goto and labels behind the scenes, so your code is already as good as it can possibly be :)
      
      -Stu
    
 
    
    
      kgobel
      13th June 2006 19:25 UTC
      Still same thing. I push cancel..it gives me a confirmation box. I click 'yes I want to exit' and then it gives me the error message (the exact error message it would as if I clicked next)..
      
      I'm wondering why the validation function is even running when I push Cancel? There isn't a way I can dig a bit deaper in here and actually handle the button events can I?
     
    
    
      Afrow UK
      13th June 2006 20:24 UTC
      Perhaps you could attach your entire script (as a file attachment) as there must be something else at fault here.
      
      -Stu
     
    
    
      galil
      13th June 2006 20:50 UTC
      
      
Function CheckID
  ReadINIStr $0 "$PLUGINSDIR\reg.ini" "Settings" "State"
  StrCmp $0 0 0 done
  ReadINIStr ${TEMP1} "$PLUGINSDIR\reg.ini" "Field 4" "State"
  System::Call /NOUNLOAD 'Dll::CheckID(t, i) i("${TEMP1}", "4") .r0'
  StrCmp $0 "1" done
  StrCmp $0 "2" incorrect
  StrCmp $0 "3" toomany
  
  incorrect:
  MessageBox MB_ICONEXCLAMATION|MB_OK "Incorrect Registration ID"
  Abort
  
  toomany:
  MessageBox MB_ICONEXCLAMATION|MB_OK "This Registration ID has been used too many times.  Please call 800-999-9999"
  Abort
  done:
  
FunctionEnd
     
    
    
      Afrow UK
      13th June 2006 20:54 UTC
      That's just Function CheckID...
      
      -Stu
     
    
    
      galil
      13th June 2006 20:58 UTC
      
      
        Originally posted by Afrow UK
        That's just Function CheckID...
      
... which performs check only if "Next" is pressed, and not every time the page leave is triggered.
    
 
    
    
      Afrow UK
      13th June 2006 21:00 UTC
      Yes, but that isn't the entire script. There's nothing wrong with that function.
      
      If you do not wish to post your entire script then you can E-mail it to me at afrowuk at tiscali dot co dot uk.
      
      -Stu
     
    
    
      Comperio
      13th June 2006 21:40 UTC
      I think I had the same problem at one time with XPUI.
      
      If memory serves me, when using ExperienceUI and using an XPUI_ABORTWARNING, you must also include an abort page. (Have a look at the documentation.)
      
      If not using XPUI_ABORTWARNING, then you must use code such as this to close the install when the user clicks on cancel:
      
Function .onUserAbort
  StrCmp $NOABORTWARNING 1 CloseMe
  MessageBox MB_YESNO|MB_ICONQUESTION "Are you sure you want to cancel Setup?" IDNO NoAbort
  # any custom code you want before the Abort page is called here...
  !insertmacro XPUI_USERABORT
  NoAbort:
  Abort
  CloseMe:
  # any custom code you want before the installer exits here...
FunctionEnd 
     
    
    
      galil
      13th June 2006 22:00 UTC
      
      
        Originally posted by Afrow UK
        Yes, but that isn't the entire script. There's nothing wrong with that function.
        
        If you do not wish to post your entire script then you can E-mail it to me at afrowuk at tiscali dot co dot uk.
        
        -Stu
      
WTF dude. I'm not the one asking question.
      I posted a solution.
      As for "nothing wrong", well, if that function is set as custom leave, unless you add the additional check to see what invoked it, it would try to calculate the ID every time it's invoked (including when user press the Cancel button, and when any control, which has notify flag set, has it's state changed).
    
 
    
    
      JasonFriday13
      13th June 2006 23:22 UTC
      lol Afrow UK must mean the question was for kgobel, not for galil.
      
      One thing I have noticed:
      
ReadINIStr ${TEMP1} "$PLUGINSDIR\reg.ini" "Field 4" "State"
System::Call /NOUNLOAD 'Dll::CheckID(t, i) i("${TEMP1}", "4") .r0'
      Shouldn't ${TEMP1} be a variable? Because this is refering to a define. Try using a variable instead, like $1:
      
ReadINIStr $1 "$PLUGINSDIR\reg.ini" "Field 4" "State"
System::Call /NOUNLOAD 'Dll::CheckID(t, i) i(.r1, "4") .r0'
      [edit]This is probably the first time I have troubleshooted a problem with the system plugin, and the first time I have read the system documentation :) .[/edit]
    
 
    
    
      Afrow UK
      13th June 2006 23:32 UTC
      galil, the Leave function is only called when the user clicks the Next button (or as you rightly say, if the NOTIFY flag is used on a control).
      
      Jason, I think kgobel is just using TEMP1 as a define for a variable, much like MUI used to use !define MUI_TEMP1 $0 before the Var instruction was introduced.
      
      I've never used XPUI so I'm with Comperio now :)
      
      -Stu