\A{usefulfunctions} Useful Scripts

\H{getieversion} Get Internet Explorer version

\c ; GetIEVersion
\c ;
\c ; Returns 1-11 (IE Version) or '' (IE is not installed) on top of the stack
\c ;
\c ; Usage:
\c ;   Call GetIEVersion
\c ;   Pop $R0 ; $R0 is "5" etc.
\c
\c Function GetIEVersion
\c   Push $R0
\c   ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "svcVersion" ; IE v10+
\c   StrCpy $R0 $R0 2
\c   IntCmp $R0 9 "" "" lbl_done
\c   ClearErrors
\c   ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "Version" ; IE v4..9
\c   IfErrors lbl_123
\c     StrCpy $R0 $R0 1 ; Note: This truncates 5.50 to 5 etc.
\c     Goto lbl_done
\c   lbl_123:
\c   !if "${NSIS_PTR_SIZE}" > 4
\c   StrCpy $R0 ""
\c   !else
\c   ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "IVer" ; IE v1..3
\c   IntCmp $R0 99 "" "" +3
\c     StrCpy $R0 ""
\c     Goto lbl_done
\c   IntOp $R0 $R0 & 3 ; 100..103->0..3
\c   IntCmp $R0 2 +2 "" +2
\c     IntOp $R0 $R0 + 1 ; Bump 100->v1 and 101->v2 (Is 101 v1.5 or 2.0?)
\c   !endif
\c   lbl_done:
\c   Exch $R0
\c FunctionEnd

\H{detect.netframework} Is .NET Framework installed?

\c ; IsDotNETInstalled
\c ;
\c ; NOTE: This is only able to detect .NET v1.x and v2.x!
\c ;
\c ; Based on GetDotNETVersion
\c ;   https://nsis.sourceforge.io/Get_.NET_Version
\c ;
\c ; Usage:
\c ;   Call IsDotNETInstalled
\c ;   Pop $0 ; 0 or 1
\c ;   StrCmp $0 1 found_dotNETFramework_v1_or_v2 no_dotNETFramework
\c 
\c Function IsDotNETInstalled
\c   Push $0
\c   System::Call '"$SysDir\MSCOREE.dll"::GetCORVersion(w,i${NSIS_MAX_STRLEN},*i)i.r0?u'
\c   IntOp $0 $0 ! ; HRESULT (S_OK) -> BOOL
\c   Exch $0
\c FunctionEnd

\H{isflashinstalled} Is Macromedia Flash Player installed?

\c ; IsFlashInstalled
\c ;
\c ; Usage:
\c ;   Call IsFlashInstalled
\c ;   Pop $R0 ; 1 or ""
\c
\c Function IsFlashInstalled
\c Push $R0
\c ReadRegStr $R0 HKCR "CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}" ""
\c StrCmp $R0 "" +2
\c   StrCpy $R0 "1"
\c Exch $R0
\c FunctionEnd

\H{connectinternet} Connect to the Internet

\c  ; ConnectInternet (uses Dialer plug-in) - Written by Joost Verburg 
\c  ;
\c  ; This function attempts to make a connection to the internet if there is no
\c  ; connection available. If you are not sure that a system using the installer
\c  ; has an active internet connection, call this function before downloading
\c  ; files with NSISdl.
\c  ; 
\c  ; The function requires Internet Explorer 3, but asks to connect manually if
\c  ; IE3 is not installed.
\c  
\c  Function ConnectInternet
\c  
\c    Push $R0
\c      
\c      ClearErrors
\c      Dialer::AttemptConnect
\c      IfErrors noie3
\c      
\c      Pop $R0
\c      StrCmp $R0 "online" connected
\c        MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet."
\c        Quit ; This will quit the installer. You might want to add your own error handling.
\c      
\c      noie3:
\c    
\c      ; IE3 not installed
\c      MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now."
\c      
\c      connected:
\c    
\c    Pop $R0
\c    
\c  FunctionEnd

\H{multipleinstances} Prevent Multiple Instances

Put the following code in your \R{oninit}{.onInit function}:

\c  System::Call 'kernel32::CreateMutex(p 0, i 0, t "myMutex") p .r1 ?e'
\c  Pop $R0
\c  
\c  StrCmp $R0 0 +3
\c    MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running."
\c    Abort

'myMutex' \e{must} be replaced by a unique string or GUID!

\H{morefuncs} More

You can find more useful scripts on \W{https://nsis.sourceforge.io/wiki/}{the NSIS Wiki}, \W{http://forums.winamp.com/forumdisplay.php?s=&forumid=65}{the NSIS forum} and the \W{https://nsis.sourceforge.io/}{NSIS development page}.