\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}.