1 /*
2  * PROJECT:     ReactOS Applications
3  * LICENSE:     LGPL - See COPYING in the top level directory
4  * FILE:        base/applications/msconfig_new/comctl32ex/comctl32supp.c
5  * PURPOSE:     Common Controls helper functions.
6  * COPYRIGHT:   Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
7  */
8 
9 #include "precomp.h"
10 
GetComCtl32Version(OUT PDWORD pdwMajor,OUT PDWORD pdwMinor,OUT PDWORD pdwBuild)11 HRESULT GetComCtl32Version(OUT PDWORD pdwMajor, OUT PDWORD pdwMinor, OUT PDWORD pdwBuild)
12 {
13     HRESULT   hr = S_OK;
14     HINSTANCE hDll;
15     DLLGETVERSIONPROC pDllGetVersion;
16     DLLVERSIONINFO dvi;
17 
18     *pdwMajor = 0;
19     *pdwMinor = 0;
20     *pdwBuild = 0;
21 
22     /*
23      * WARNING! DISCLAIMER!
24      *
25      * This method of retrieving a handle to an already loaded comctl32.dll
26      * is known to not be reliable in case the program is using SxS, or if
27      * this code is used from inside a DLL.
28      */
29 
30     /*
31      * See: https://msdn.microsoft.com/en-us/library/windows/desktop/hh298349(v=vs.85).aspx
32      * and: http://www.geoffchappell.com/studies/windows/shell/comctl32/history/
33      * for the possible version values to be returned.
34      */
35 
36     /* Get a handle to comctl32.dll that must already be loaded */
37     hDll = GetModuleHandleW(L"comctl32.dll"); // NOTE: We must not call FreeLibrary on the returned handle!
38     if (!hDll) return E_FAIL;
39 
40     pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hDll, "DllGetVersion");
41     if (pDllGetVersion)
42     {
43         ZeroMemory(&dvi, sizeof(dvi));
44         dvi.cbSize = sizeof(dvi);
45 
46         hr = (*pDllGetVersion)(&dvi);
47         if (SUCCEEDED(hr))
48         {
49             *pdwMajor = dvi.dwMajorVersion;
50             *pdwMinor = dvi.dwMinorVersion;
51             *pdwBuild = dvi.dwBuildNumber;
52 
53 #if 0
54 // #include "stringutils.h"
55 
56             LPWSTR strVersion =
57                 FormatString(L"ComCtl32 version %d.%d, Build %d, Platform %d",
58                              dvi.dwMajorVersion, dvi.dwMinorVersion, dvi.dwBuildNumber, dvi.dwPlatformID);
59             MessageBoxW(NULL, strVersion, L"ComCtl32 version", MB_OK);
60             MemFree(strVersion);
61 #endif
62         }
63     }
64     else
65     {
66         /*
67          * If GetProcAddress failed, the DLL is a version
68          * previous to the one shipped with IE 3.x.
69          */
70         *pdwMajor = 4;
71         *pdwMinor = 0;
72         *pdwBuild = 0;
73     }
74 
75     return hr;
76 }
77