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

    • Live Event Date: December 11, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT Market pressures to move more quickly and develop innovative applications are forcing organizations to rethink how they develop and release applications. The combination of public clouds and physical back-end infrastructures are a means to get applications out faster. However, these hybrid solutions complicate DevOps adoption, with application delivery pipelines that span across complex hybrid cloud and non-cloud environments. Check out this …

    • VMware vCloud® Government Service provided by Carpathia® is an enterprise-class hybrid cloud service that delivers the tried and tested VMware capabilities widely used by government organizations today, with the added security and compliance assurance of FedRAMP authorization. The hybrid cloud is becoming more and more prevalent – in fact, nearly three-fourths of large enterprises expect to have hybrid deployments by 2015, according to a recent Gartner analyst report. Learn about the benefits of …

    Most Popular Programming Stories

    More for Developers

    Latest Developer Headlines

    RSS Feeds