Subversion Repositories DevTools

Rev

Blame | Last modification | View Log | RSS feed

;------------------------------------------------------------------------------
;   Code originally from http://nsis.sourceforge.net/How_to_ensure_a_required_version_of_.NET_Framework_is_installed
;
;   This macro checks that a specified dot net version is present in the target
;   machine.
;
;   usage:
;    !insertmacro DotNetSearch 4 0 30319 "ABORT" ""
;
;   Parameters:
;   1 DOTNETVMAJOR              Compulsory, minimum major version required
;   2 DOTNETVMINOR              Compulsory, minimum minor version required
;   3 DOTNETVMINORMINOR         Option minimum build version required. Set to "" if not important
;   4 DOTNETLASTFUNCTION        What to do if no dot net found
;                               One of the following :
;                                  INSTALL_ABORT    : Give user option of installing it, or aborting
;                                  INSTALL_NOABORT  : Give user option of installing it, or returning
;                                                     to caller and let them decide on action needed
;                                  WARNING          : Just issue a warning and return to caller and let
;                                                     them decide on action needed
;                                  ABORT            : Abort the installer
;                                  IGNORE           : Just return to caller and let them decide on
;                                                     action needed
;   5 DOTNETINSTALLEREXE        Path to dotnet exe to install the dotnet framework
;------------------------------------------------------------------------------
        Var /GLOBAL DNS_RETVAL
        Var /GLOBAL DNS_SUBKEY
        Var /GLOBAL DNS_REGKEY2
        Var /GLOBAL DNS_REGKEY
        Var /GLOBAL DNS_TMPSTR
        Var /GLOBAL DNS_ENUMINDEX
        Var /GLOBAL DNA_INSTALLROOT
        Var /GLOBAL DOTNETPATH

!macro DotNetSearch DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR DOTNETLASTFUNCTION DOTNETINSTALLEREXE
        Push $DNS_RETVAL
        Push $DNS_SUBKEY
        Push $DNS_REGKEY2
        Push $DNS_REGKEY
        Push $DNS_TMPSTR
        Push $DNS_ENUMINDEX
        Push $DNA_INSTALLROOT

        StrCpy $DNS_RETVAL "0"
        StrCpy $DNS_SUBKEY "SOFTWARE\Microsoft\.NETFramework"
        StrCpy $DNS_ENUMINDEX 0

        ; Here is where we start to iterate over the registry area that lists evidence of the installed dotnet frameworks

        DotNetStartEnum:
                ; Look in HKLM\SOFTWARE\Microsoft\.NETFramework\policy for v?.?
                EnumRegKey $DNS_REGKEY HKLM "$DNS_SUBKEY\policy" $DNS_ENUMINDEX
                StrCmp $DNS_REGKEY "" noDotNet dotNetFound
        dotNetFound:
                ; Does entry begin with "v"?
                StrCpy $DNS_TMPSTR $DNS_REGKEY 1 0
                StrCmp $DNS_TMPSTR "v" +1 goNextDotNet

                ; Examine major version of in the "v?.?" string
                StrCpy $DNS_TMPSTR $DNS_REGKEY 1 1
                IntCmp $DNS_TMPSTR ${DOTNETVMAJOR} +1 goNextDotNet yesDotNetReg

                ; Examine minor version of in the "v?.?" string
                StrCpy $DNS_TMPSTR $DNS_REGKEY 1 3
                IntCmp $DNS_TMPSTR ${DOTNETVMINOR} +1 goNextDotNet yesDotNetReg

                ; Has caller specified a dotnet BUILD version number ?
                StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg +1

                ; Look in HKLM\SOFTWARE\Microsoft\.NETFramework\policy\v?.? for the build version key and
                ; compare it to caller specified value. It is acceptable if it is equal to or greater than
                ; the caller specified value
                EnumRegValue $DNS_TMPSTR HKLM  "$DNS_SUBKEY\policy\$DNS_REGKEY" 0
                StrCmp $DNS_TMPSTR "" goNextDotNet
                IntCmpU $DNS_TMPSTR ${DOTNETVMINORMINOR} yesDotNetReg goNextDotNet yesDotNetReg

        goNextDotNet:
                ; Increment index into the enumerated list of keys and advance to next iteration
                IntOp $DNS_ENUMINDEX $DNS_ENUMINDEX + 1
                Goto DotNetStartEnum

        yesDotNetReg:
                ; Looks like we have a dotnet version required.
                ; Look in HKLM\SOFTWARE\Microsoft\.NETFramework\policy\v?.? for the build version key and use it
                ; to form a path we can check for the presence of actual files in a dotnet framework installation
                EnumRegValue $DNS_REGKEY2 HKLM "$DNS_SUBKEY\policy\$DNS_REGKEY" 0
                StrCmp $DNS_REGKEY2 "" noDotNet

                ; Look in HKLM\SOFTWARE\Microsoft\.NETFramework\ for the installation root folder path
                ReadRegStr $DNA_INSTALLROOT  HKLM $DNS_SUBKEY "InstallRoot"
                StrCmp $DNA_INSTALLROOT "" noDotNet

                ; Check for existence of the mscorlib.dll in the file system to prove the dot net framework has been installed
                ;  DNA_INSTALLROOT contains something like "c:\WINDOWS\Microsoft.NET\Framework\"
                ;  DNS_REGKEY contains something like "v4.0"
                ;  DNS_REGKEY2 contains something like "30319"
                StrCpy $DOTNETPATH "$DNA_INSTALLROOT$DNS_REGKEY.$DNS_REGKEY2"

                StrCpy $DNS_TMPSTR "$DOTNETPATH\mscorlib.dll"
                IfFileExists $DNS_TMPSTR +1 noDotNet

                ; Check for existence of the installutil.exe in the file system to prove the dot net framework has been installed
                StrCpy $DNS_TMPSTR "$DOTNETPATH\installutil.exe"
                IfFileExists $DNS_TMPSTR yesDotNet noDotNet

        noDotNet:
                StrCmp ${DOTNETLASTFUNCTION} "INSTALL_ABORT" +1 nDN2
                        MessageBox MB_YESNO|MB_ICONQUESTION \
                        "You must have Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR}$\nor higher installed. Install now?" \
                        IDYES +2 IDNO +1
                        Abort
                        ExecWait '${DOTNETINSTALLEREXE}'
                        Goto DotNetStartEnum
        nDN2:
                StrCmp ${DOTNETLASTFUNCTION} "INSTALL_NOABORT" +1 nDN3
                        MessageBox MB_YESNO|MB_ICONQUESTION \
                        "Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed.$\nDo so now?" \
                        IDYES +1 IDNO +3
                        ExecWait '${DOTNETINSTALLEREXE}'
                        Goto DotNetStartEnum
                        StrCpy $DNS_RETVAL 0
                        Goto DotNetFinish
        nDN3:
                StrCmp ${DOTNETLASTFUNCTION} "WARNING" +1 nDN4
                        MessageBox MB_OK|MB_ICONEXCLAMATION \
                        "Warning:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed!" \
                        IDOK 0
                        StrCpy $DNS_RETVAL 0
                        Goto DotNetFinish
        nDN4:
                StrCmp ${DOTNETLASTFUNCTION} "ABORT" +1 nDN5
                        MessageBox MB_OK|MB_ICONEXCLAMATION \
                        "Error:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed, aborting!" \
                        IDOK 0
                        Abort
        nDN5:
                StrCmp ${DOTNETLASTFUNCTION} "IGNORE" +1 nDN6
                        StrCpy $DNS_RETVAL 0
                        Goto DotNetFinish
        nDN6:
                MessageBox MB_OK \
                "$(^Name) Setup internal error.$\nMacro 'DotNetSearch', parameter '4'(${DOTNETLASTFUNCTION})invalid.$\nValue must be INSTALL_ABORT|INSTALL_NOABORT|WARNING|ABORT|IGNORE$\nSorry for the inconvenience.$\n$\tAborting..." \
                IDOK 0
                Abort

        yesDotNet:
                StrCpy $DNS_RETVAL 1

        DotNetFinish:
                Pop $DNA_INSTALLROOT
                Pop $DNS_ENUMINDEX
                Pop $DNS_TMPSTR
                Pop $DNS_REGKEY
                Pop $DNS_REGKEY2
                Pop $DNS_SUBKEY
                Exch $DNS_RETVAL
!macroend