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