Geoff Chappell - Software Analyst
The Common Controls library (COMCTL32.DLL) has so far existed in 11 variations considered by Microsoft to have sufficient external impact to deserve at least a difference in the minor version number.
|3.51||Windows NT 3.51|
|4.70||Windows 95 OSR2||Windows NT 4.0||3.01, 3.02|
|4.72||Windows 98||late Windows NT 4.0 service packs||4.01|
|5.80||Windows 98 SE||5.0|
|5.81||Windows Me||Windows 2000||5.01, 5.5, 6.0|
Windows Server 2003
Windows Server 2008
|6.0||Windows XP (SxS)
Windows Server 2003 (SxS)
|6.10||Windows Vista (SxS)
Windows Server 2008 (SxS)
Windows 7 (SxS)
No distribution with Windows, NT or Internet Explorer is shown for version 3.50 because all copies inspected were found on disks for other products (specifically, for Win32s as redistributed with various packages for Windows programming). Versions 3.50 and 3.51 predate my experience with 32-bit user-mode Windows and have been included in this study mostly for curiosity. They also predate what has become for most users the essential look and feel of Windows, i.e., the taskbar and Start menu. Yet these versions are 32-bit executables, they are named COMCTL32.DLL (in contrast to the 16-bit COMMCTRL.DLL), and there is demonstrable continuity—including for some functions that Microsoft finally got round to documenting in 2006, supposedly as being new for Windows Vista!
Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008 and Windows 7 each supply two, three or even four versions of COMCTL32. Versions 6.0 and 6.10 are meant only as side-by-side (SxS) assemblies and must be requested via an application manifest. Version 5.82 is meant for general use as a natural upgrade from earlier Windows versions. It is the copy in the Windows System directory, though it may also be installed among the assemblies and can be specified in a manifest.
Until at least 2007, version 5.82 was omitted from the presumably authoritative review of shell DLL versions that Microsoft presents on the page Shell and Common Controls Versions in the MSDN Library. This omission is curious since version 5.82 was by then quite old yet still current, being used by programs that for one reason or another have not been built with a manifest. Curiously, it is now (16th September 2008) versions 6.0 and 6.10 that are omitted from the table, though “version 6” gets a mention afterwards, in a note.
Microsoft’s list may have a false positive also: Microsoft says that version 4.0 is “found on the original versions of … Windows NT 4.0”, and perhaps it is, somewhere that I have missed, but my inspection of what seems to be an original version of NT 4.0 turns up 4.70 only. A version 4.0 for NT is known, however, in an Internet Explorer 3.00 for Windows NT. (Unfortunately for any forensic interest in this early history, I have no Internet Explorer 3.00 for Windows 95.)
COMCTL32 was for many years distributed with Internet Explorer as well as with Windows. Indeed, it was often that the earliest way to obtain new COMCTL32 features so that your Windows programs would look better was not to get your customers to use the latest build of Windows but to install the latest Internet Explorer. Distribution of COMCTL32 with Internet Explorer is discontinued in Internet Explorer 7.0.
Though the next table fusses over such details as build numbers and dates, it is certainly not meant as a comprehensive list even of builds that had formal, public releases. For that, consult Microsoft, who manufacture the software and are surely best able of anyone to present a definitive record. Bear in mind, however, that if Microsoft’s published documentation could sensibly be relied on as either comprehensive or accurate, then you could not now be reading these notes.
Builds are arranged in increasing order of the file version as recorded in the executable’s resources. This version number is readily visible using Windows Explorer either in a so-called infotip for the file or by accessing the Version tab in the Properties dialog for the file. Programmers know this version number as coming from the so-called root block of the version-information resource, specifically from the dwFileVersionMS and dwFileVersionLS members of a VS_FIXEDFILEINFO structure.
The date stamp shown for each version is more obscure. File dates are easily modified after the executable is built and are anyway liable to be shown differently when read from different time zones. However, there is in each executable’s header a date stamp which is set when the executable is built and which is not commonly changed afterwards. It is readily accessible to anyone with programming knowledge and appropriate tools, e.g., Microsoft’s own DUMPBIN utility.
|File Version||File Header Date Stamp||Size||Package|
|3.50.1057.158||30032D75 (12th July 1995)||201,728||Win32s 1.30 (Win32 SDK)|
|3.50.1057.166||304C65B8 (6th September 1995)||284,432||Win32s 1.30 (Visual C++ 4.0, 4.1)|
|3.51.1052.1||2FC3DDD9 (25th May 1995)||199,440||Windows NT 3.51|
|22.214.171.1240||2FF383BD (30th June 1995)||182,272||Windows 95|
|4.0.1234.1||312D2708 (23rd February 1996)||267,776||Internet Explorer 3.00 (NT)|
|4.70.1144.1||31F95735 (27th July 1996)||310,544||Windows NT 4.0|
|126.96.36.1996||3201445E (2nd August 1996)
320D0356 (11th August 1996)
|379,152||Internet Explorer 3.01, 3.02
Windows 95 OSR2
|4.70.1147.1||336106FE (26th April 1997)||310,032||Windows NT 4.0 SP3|
|4.71.1712.3||342172BB (19th September 1997)||447,760||Internet Explorer 4.0 (Windows)|
|432173A5 (19th September 1997)||461,072||Internet Explorer 4.0 (NT)|
|4.72.2106.4||347246C0 (19th November 1997)||449,296||Internet Explorer 4.01 (Windows)|
|347247A4 (19th November 1997)||462,608||Internet Explorer 4.01 (NT)|
|4.72.3110.1||35474F62 (30th April 1998)||458,752||Windows 98|
|3553AA8E (9th May 1998)||447,760||Internet Explorer 4.01 SP1 (Windows)|
|3553AB87 (9th May 1998)||463,120||Internet Explorer 4.01 SP1 (NT)|
|4.72.3609.2200||361A60A0 (7th October 1998)||464,144||Windows NT 4.0 SP4|
|4.72.3612.1702||36E5A94E (10th March 1999)||465,680||Windows NT 4.0 SP5, SP6|
|36EEB448 (17th March 1999)||450,832||Internet Explorer 4.01 SP2 (Windows)|
|36EEB5B0 (17th March 1999)||465,680||Internet Explorer 4.01 SP2 (NT)|
|5.80.2314.1000||36F1D8D8 (19th March 1999)||577,808||Internet Explorer 5.0 (Windows)|
|36F1DBAF (19th March 1999)||557,328||Internet Explorer 5.0 (NT)|
|5.80.2614.3500||3720A1CD (24th April 1999)||577,808||Windows 98 SE|
|5.81.2920.0||3844D035 (1st December 1999)||553,232||Windows 2000|
|5.81.3103.1000||38E3FD10 (31st March 2000)||529,680||Internet Explorer 5.01 (Windows 2000)|
|3947EB46 (15th June 2000)||550,672||Windows 2000 SP1|
|5.81.3105.105||3941292C (10th June 2000)||569,104||Internet Explorer 5.01 (Windows)|
|39412A8F (10th June 2000)||552,720||Internet Explorer 5.01 (NT)|
|5.81.3315.3727||3D3D020C (23rd July 2001)||552,208||Windows 2000 SP3|
|5.81.3502.6601||3EF274DD (20th June 2002)||550,672||Windows 2000 SP4|
|5.81.4134.100||39403BE1 (9th June 2000)||581,632||Windows Me|
|5.81.4134.600||393D876E (7th June 2000)||569,616||Internet Explorer 5.5 (Windows)|
|393D8BF4 (7th June 2000)||553,232||Internet Explorer 5.5 (NT)|
|5.81.4704.1100||3B7DFE48 (18th August 2001)||569,616||Internet Explorer 6.0 (Windows)|
|3B7DFFE7 (18th August 2001)||553,232||Internet Explorer 6.0 (NT)|
|5.81.4807.2300||3B5CD622 (24th July 2001)||569,616||Internet Explorer 5.5 SP2 (Windows)|
|3B5CD984 (24th July 2001)||553,232||Internet Explorer 5.5 SP2 (NT)|
|5.81.4916.400||3D6E2AA6 (30th August 2002)||548,624||Internet Explorer 6.0 SP1 (Windows)|
|3D6E2BF2 (30th August 2002)||529,680||Internet Explorer 6.0 SP1 (NT)|
|5.82.2600.0||3B7DFE0F (18th August 2001)||557,568||Windows XP|
|5.82.2800.1106||3D6DFA2A (29th August 2002)||557,056||Windows XP SP1|
|5.82.2900.2180||411096AF (4th August 2004)||611,328||Windows XP SP2|
|5.82.2900.5512||4802A0C8 (14th April 2008)||617,472||Windows XP SP3|
|5.82.3790.0||3E802498, 3E8024C5 (25th March 2003)||574,464||Windows Server 2003|
|5.82.3790.1830||42437797, 424377F2 (25th March 2005)||599,040||Windows Server 2003 SP1|
|5.82.3790.3959||45D70A06, 45D70A71 (18th February 2007)||599,040||Windows Server 2003 SP2|
|5.82.6000.16386||4549BCB0, 4549BD08 (2nd November 2006)||537,088||Windows Vista
Windows Vista SP1
|5.82.6001.18000||4791A629, 4791A751 (19th January 2008)||531,968||Windows Vista SP1
Windows Server 2008
|5.82.7600.16385||4A5BDA24 (14th July 2009)||530,432||Windows 7|
|6.0.2600.0||3B7DFE32 (18th August 2001)||921,088||Windows XP
Windows XP SP1
Windows Server 2003
Windows XP SP2
|6.0.2800.1106||3D6DF9B6 (29th August 2002)||921,600||Windows XP SP1|
|6.0.2900.2180||4110968C (4th August 2004)||1,050,624||Windows XP SP2|
|6.0.2900.5512||4802A094 (14th April 2008)||1,054,208||Windows XP SP3|
|6.0.3790.0||3E8024C5 (25th March 2003)||928,768||Windows Server 2003|
|6.0.3790.1830||42437797 (25th March 2005)||1,051,136||Windows Server 2003 SP1|
|6.0.3790.3959||45D70A05 (18th February 2007)||1,051,648||Windows Server 2003 SP2|
|6.10.6000.16386||4549BD09 (2nd November 2006)||1,648,128||Windows Vista
Windows Vista SP1
|6.10.6001.18000||4791A752 (19th January 2008)||1,684,480||Windows Vista SP1
Windows Server 2008
|6.10.6002.18005||49E036F3 (11th April 2009)||1,686,016||Windows Vista SP2|
|6.10.7600.16385||4A5BD976 (14th July 2009)||1,680,896||Windows 7|
Internet Explorer 3.01 and 3.02 have exactly the same COMCTL32.DLL. The one from Windows 95 OSR2 is the same except for rebasing, both for the executable itself and for imported addresses, with a corresponding change in the file header’s date stamp and checksum.
The COMCTL32.DLL executables for NT 4.0 Service Packs 5 and 6 are exactly identical.
Where version 5.82 is supplied both in the Windows System directory and as an assembly, the two differ only because of rebasing and the consequent change in the file header’s date stamp and checksum.
Several builds of versions 5.82, 6.00 and 6.10 are each shown with two or more packages. In each such case, the executables are exactly the same.
Version 5.82 is especially long-lived, with streams from five different products, such that the programming interface is acquiring some difficult variation from build to build. One variation, in which functions that had been exported only by ordinal become also exported by name, arises from Microsoft’s documentation of Settlement Program Interfaces and also affects version 6.0. This version is almost as difficult, but at least Microsoft was kind enough to bump up the version number to 6.10 for Windows Vista, apparently bringing version 6.0 to an end, while version 5.82 lives on. Version 6.10 looks set to live long, too, for although Windows 7 is promoted as an important advance on Windows Vista, it does not raise the version number for COMCTL32.
Among much that is silly about all this is that Microsoft has long campaigned that programmers should test the version number of the DLL that they want their code to interact with, rather than assume that a particular version of that DLL is present for a particular version of Windows. Then Microsoft goes and makes the DLL version number all but useless!
This study refers to applicable products and service packs in ascending order of versions and build numbers. Be aware that this is not chronological order. For instance, the phrase “version 6.0 from Windows XP SP2 and higher” also includes all builds of version 6.0 from Windows Server 2003, even though the original Windows Server 2003 predates Windows XP SP2. Where the original Windows Server 2003 is excluded, as sometimes is needed, the two products are specified: “version 6.0 from Windows XP SP2 and Windows Server 2003 SP1 and higher”. A comma before “and higher” indicates that the description takes in not only higher builds from the stated version but also higher versions. For instance, the phrase “version 6.0 from Windows XP SP2, and higher” also includes version 6.10 from Windows 7.
COMCTL32 presents a particular problem in that some development of version 5.82 occurs in parallel with versions 6.0 and 6.10. A phrase such as “versions 5.82 and 6.0 from Windows XP SP1 and higher” is equivalent to the combination of “version 5.82 from Windows XP SP1 and higher” and “version 6.0 from Windows XP SP1 and higher”, and thus does not include the build of version 6.0 from the original Windows XP. A phrase such as “versions 5.82 and 6.10 from Windows Vista SP1 and higher” is equivalent to the combination of “version 5.82 from Windows Vista SP1 and higher” and “version 6.10 from Windows Vista SP1 and higher”, and thus does not include any builds of version 6.0 nor the build of version 6.10 from the original Windows Vista.
The various releases of Windows XP, Windows Server 2003 and Windows Vista each have as many as four different COMCTL32 builds. All have a version 5.82 in the Windows System directory. More builds, from versions 5.82, 6.00 and 6.10, are supplied as assemblies.
Each assembly is represented by an executable and a manifest. Both are in the tree beneath the WinSxs subdirectory of the Windows directory. The executables are all named COMCTL32.DLL, but different versions are in different subdirectories. The executable in the subdirectory named assembly has the manifest named assembly.manifest in the Manifests subdirectory. Note that the version number contained in this name can differ significantly from what the executable reports, both statically in its version-information resource and at run-time for the DllGetVersion function.
|File Version||Assembly Directory|
|6.0.2900.5512||TO BE DONE|
The Windows packages that have version 5.82 as an assembly also include this assembly in what Microsoft’s symbol files suggest is called the System Default Activation Context, as constructed from the Microsoft.Windows.SystemCompatible manifest. If a program that has no application manifest runs on these Windows versions, the COMCTL32.DLL that gets loaded is the copy among the assemblies, much as if the program actually had specified version 5.82 in an application manifest.