Retrieving the version of Internet Explorer

-->

Sometimes it is useful to know if the computer running your software has the one or other version of the Internet Explorer installed. I needed this routine when writing my own setup program for a piece of work which used the Active X Webbrowser control and required IE 3.02 or upper. I am able to start the IE setup program and sent clicking messages to the various dialog boxes popping up, so the user could click on "Install", lean back in his armchair and relax watching the procedure.

Until someone came to install it on a machine running IE 4.0. He had a bad suprise when calling a help function, the whole machine crashed ...

According to Knowledge Base article Q1644539, I wrote a function that detects any of these MSIE Versions:
  • Internet Explorer 1.0 (Plus!)
  • Internet Explorer 2.0
  • Internet Explorer 3.0
  • Internet Explorer 3.0 (OSR2)
  • Internet Explorer 3.01
  • Internet Explorer 3.02
  • Internet Explorer 4.0 Platform Preview 1.0 (PP1)
  • Internet Explorer 4.0 Platform Preview 2.0 (PP2)
  • Internet Explorer 4.0
  • Internet Explorer 4.01
  • Internet Explorer 4.01 Service Pack 1 (SP1)

  •  

     

    I know that there are at least three other versions of Internet Explorer outside: IE 4.05, the IE5.0 beta and the IE 4.x version coming with Windows 98. I'm pretty sure that they have unique version strings in the registry, so it should be very easy to add their correct detection. By now they should be interpreted as IE 4.01 SP1, which is the most recent version I handle here. If you know of any other versions - and how to detect them (e.g. where are IE 4.02 to 4.04?) feel free to add a comment or source code.

    The trick used is to open the registry key HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer and look at various string values. MS has used more than one entry for version information, so the code is somewhat nested, but still easy to understand (I hope so). If you are interested in the full details, please refer to the Knowledge Base.

    You may use this code as implemented here (a function) or - if you don't like the global functions - make it a member function of your class needing the information.

    In the header file for the function (or class) definition you need these definitions:

    enum IEVERSION
    {
     IE_UNKNOWN= 0, // no IE installed or error while retrieving information
     IE_10W95 = 1,  // Internet Explorer 1.0 (Plus!)
     IE_20W95,      // Internet Explorer 2.0 for Windows 95
     IE_20WNT,      // Internet Explorer 2.0 for Windows NT
     IE_30,         // Internet Explorer 3.0 - this is the version normally distributed with W95
     IE_30OSR2,     // Internet Explorer 3.0 - this is the version normally distributed with W95b
     IE_301,        // Internet Explorer 3.01
     IE_302,        // Internet Explorer 3.02
     IE_40PP1,      // Internet Explorer 4.0 Platform Preview 1.0 (PP1)
     IE_40PP2,      // Internet Explorer 4.0 Platform Preview 2.0 (PP2)
     IE_40,         // Internet Explorer 4.0
     IE_401,        // Internet Explorer 4.01
     IE_401SP1     // Internet Explorer 4.01 Service Pack 1 (SP1)
    };
    // function declaration for the detection function
    IEVERSION IEVersion();
    
    In the source code file, use this:
    IEVERSION IEVersion()
    {
     HKEY hCU; IEVERSION c_nIEVersion = IE_UNKNOWN;
    
     // let's open the Registry key for IE
     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
     "Software\\Microsoft\\Internet Explorer", 
     0,KEY_QUERY_VALUE,
     &hCU) == ERROR_SUCCESS)
     {
      char szIEx[100];
      DWORD ulSize=100;
    
      if (RegQueryValueEx( hCU, "Version", NULL, NULL, (LPBYTE)szIEx, &ulSize)==ERROR_SUCCESS)
      { 
       // the "Version" key exists, so it is Internet Explorer 4.x
       // now detect the subversion, which should be one of the following:
       //
       // 4.71.544 Internet Explorer 4.0 Platform Preview 1.0 (PP1)
       // 4.71.1008.3 Internet Explorer 4.0 Platform Preview 2.0 (PP2)
       // 4.71.1712.6 Internet Explorer 4.0
       // 4.72.2106.8 Internet Explorer 4.01
       // 4.72.3110.8 Internet Explorer 4.01 Service Pack 1 (SP1)
    
       CString ver(szIEx), majVer, minVer, buildNo, subNo;
    
       // cut the main version number
       majVer = ver.Left(ver.Find('.')); ver = ver.Mid(ver.Find('.')+1);
    
       // cut the minor version number
       minVer = ver.Left(ver.Find('.')); ver = ver.Mid(ver.Find('.')+1);
    
       // cut the build number
       if (ver.Find('.')==-1)
       {
        buildNo = ver.Left(ver.Find('.'));
        subNo = ver.Mid(ver.Find('.')+1); // sub-build number
       }
       else
        buildNo = ver;
    
       if (atoi(majVer)>= 4) 
       {
        c_nIEVersion = IE_40PP1; // at least this is the Platform Preview 1
        if (atoi(majVer) == 4 && atoi(minVer)<71)
         // this can only happen if there is an error in the version info string 
         c_nIEVersion = IE_UNKNOWN;
        else if (atoi(minVer)>72 || atoi(majVer)> 4)
         // we have encountered the highest checked version of this function
         // if you need to implement more versions (the IE 4.05 and IE 5.0 beta are out)
         // you can implement more comparisons
         c_nIEVersion = IE_401SP1;
        else if (atoi(minVer)==72 && atoi(buildNo) >= 2106)
         c_nIEVersion = IE_401;
        else if (atoi(buildNo) >= 1712)
         c_nIEVersion = IE_40;
        else if (atoi(buildNo) >= 1008)
         c_nIEVersion = IE_40PP2;
        else if (atoi(buildNo) >= 544)
         c_nIEVersion = IE_40PP1;
        else // this can only happen if there is an error in the Version info
         c_nIEVersion = IE_UNKNOWN;
       }
      } // end_if (RegQueryValueEx( hCU, "Version", ...))
      else if (RegQueryValueEx(hCU, "Build", NULL, NULL, 
       (LPBYTE)szIEx, &ulSize)==ERROR_SUCCESS)
      {
       // the "Build" key exists, so it is Internet Explorer 3.x
       // now detect the subversion, which should be one of the following:
       //
       // 520 Internet Explorer 2.0
       // 1155 Internet Explorer 3.0
       // 1158 Internet Explorer 3.0 (OSR2)
       // 1215 Internet Explorer 3.01
       // 1300 Internet Explorer 3.02
       //
       if (atoi(szIEx) < 520)
        c_nIEVersion = IE_UNKNOWN;
       else if (atoi(szIEx) < 1155)
        c_nIEVersion = IE_20W95;
       else if (atoi(szIEx) < 1158)
        c_nIEVersion = IE_30;
       else if (atoi(szIEx) < 1215)
        c_nIEVersion = IE_30OSR2;
       else if (atoi(szIEx) < 1300)
        c_nIEVersion = IE_301;
       else if (atoi(szIEx) >= 1300)
        c_nIEVersion = IE_302;
      }
      else if (RegQueryValueEx(hCU, "IVer", NULL, NULL, 
       (LPBYTE)szIEx, &ulSize)==ERROR_SUCCESS)
      {
       // IVer was used in the IE versions before 3.0
       if (atoi(szIEx)==100)
        c_nIEVersion = IE_10W95;
       else if (atoi(szIEx)==102)
        c_nIEVersion = IE_20W95;
       else if (atoi(szIEx)==101)
        c_nIEVersion = IE_20WNT;
      }
      RegCloseKey(hCU);
     }
     return c_nIEVersion;
    }
    
    That's it. If you need to insure you have a machine with IE 3 or upper, just test...
    if (IEVersion() < IE_30)
    // warning here
    else 
    // it's OK

    WM_HAVEALOTOFLUCK

     Thomas
     


    Comments

    Leave a Comment
    • Your email address will not be published. All fields are required.

    Top White Papers and Webcasts

    • Moving from an on-premises environment to Office 365 does not remove the need to plan for disruptions or reduce the business risk requirements for protecting email services. If anything, some risks increase with a move to the cloud. Read how to ease the transition every business faces if considering or already migrating to cloud email. This white paper discusses: Setting expectations when migrating to Office 365 Understanding the implications of relying solely on Exchange Online security Necessary archiving …

    • 2015 is shaping up to include some of the best innovation the mobile industry has ever experienced. There will be new discoveries, new technologies, and existing giants in the vendor space will test the limits to increase productivity while ensuring the confidentiality, integrity, and availability of data. While all of this innovation is taking place, enterprises must continue to remain vigilant as cybercriminals continue to look for weaknesses to steal company data, and intellectual property by infiltrating …

    Most Popular Programming Stories

    More for Developers

    RSS Feeds

    Thanks for your registration, follow us on our social networks to keep up-to-date